aboutsummaryrefslogtreecommitdiffstats
path: root/apps/http-server/http-client
diff options
context:
space:
mode:
Diffstat (limited to 'apps/http-server/http-client')
-rw-r--r--apps/http-server/http-client/http_client.h35
-rw-r--r--apps/http-server/http-client/http_client_icn.cc37
-rw-r--r--apps/http-server/http-client/http_client_icn.h34
-rw-r--r--apps/http-server/http-client/http_client_tcp.cc99
-rw-r--r--apps/http-server/http-client/http_client_tcp.h36
5 files changed, 241 insertions, 0 deletions
diff --git a/apps/http-server/http-client/http_client.h b/apps/http-server/http-client/http_client.h
new file mode 100644
index 000000000..087a061ab
--- /dev/null
+++ b/apps/http-server/http-client/http_client.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2019 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <string>
+
+#if defined(HICNET)
+#include <hicn/transport/http/facade.h>
+#elif defined(ICNET)
+#include <icnet/icnet_http_facade.h>
+#else
+#error "No ICN tranport library to which link against."
+#endif
+
+class HTTPClient {
+ public:
+ virtual ~HTTPClient() = default;
+
+ virtual void setTcp() = 0;
+
+ virtual bool download(const std::string &url, std::ostream &out) = 0;
+};
diff --git a/apps/http-server/http-client/http_client_icn.cc b/apps/http-server/http-client/http_client_icn.cc
new file mode 100644
index 000000000..327d2eed1
--- /dev/null
+++ b/apps/http-server/http-client/http_client_icn.cc
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2019 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "http_client_icn.h"
+#include "response.h"
+
+#include <curl/curl.h>
+
+using namespace std;
+
+HTTPClientIcn::HTTPClientIcn(uint32_t timeout) {
+ std::chrono::seconds _timeout(timeout);
+ connection_.setTimeout(_timeout);
+}
+
+void HTTPClientIcn::setTcp() {}
+
+HTTPClientIcn::~HTTPClientIcn() {}
+
+bool HTTPClientIcn::download(const std::string &url, std::ostream &out) {
+ connection_.get(url);
+ libl4::http::HTTPResponse r = connection_.response();
+ out.write(reinterpret_cast<const char *>(r.data()), r.size());
+ return true;
+}
diff --git a/apps/http-server/http-client/http_client_icn.h b/apps/http-server/http-client/http_client_icn.h
new file mode 100644
index 000000000..5586f6d62
--- /dev/null
+++ b/apps/http-server/http-client/http_client_icn.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2019 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "http_client.h"
+
+#include <string>
+
+class HTTPClientIcn : public HTTPClient {
+public:
+ HTTPClientIcn(uint32_t timeout);
+
+ void setTcp();
+
+ ~HTTPClientIcn();
+
+ bool download(const std::string &url, std::ostream &out);
+
+private:
+ libl4::http::HTTPClientConnection connection_;
+};
diff --git a/apps/http-server/http-client/http_client_tcp.cc b/apps/http-server/http-client/http_client_tcp.cc
new file mode 100644
index 000000000..530f8ef95
--- /dev/null
+++ b/apps/http-server/http-client/http_client_tcp.cc
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2019 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "http_client_tcp.h"
+#include "response.h"
+
+#include <curl/curl.h>
+#include <iostream>
+#include <sstream>
+#include <stdio.h>
+#include <string.h>
+
+using namespace std;
+
+struct UserData {
+ void *out;
+ void *curl;
+ bool tcp;
+ bool first_time;
+};
+
+typedef struct UserData UserData;
+
+size_t write_data(void *ptr, size_t size, size_t nmemb, void *user_data) {
+
+ UserData *data = (UserData *)user_data;
+
+ if (data->first_time) {
+ double cl;
+
+ int res =
+ curl_easy_getinfo(data->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &cl);
+
+ if (res >= 0) {
+ *(ostream *)data->out
+ << "HTTP/1.0 200 OK\r\nContent-Length: " << std::size_t(cl)
+ << "\r\n\r\n";
+ }
+
+ data->first_time = false;
+ }
+
+ ((icn_httpserver::Response *)data->out)
+ ->write((const char *)ptr, size * nmemb);
+ // ((icn_httpserver::Response*) data->out)->send();
+ return size * nmemb;
+}
+
+HTTPClientTcp::HTTPClientTcp() {
+ tcp_ = false;
+ first_time = true;
+ curl_ = curl_easy_init();
+}
+
+void HTTPClientTcp::setTcp() { tcp_ = true; }
+
+HTTPClientTcp::~HTTPClientTcp() { curl_easy_cleanup(curl_); }
+
+bool HTTPClientTcp::download(const std::string &url, std::ostream &out) {
+ curl_easy_setopt(curl_, CURLOPT_URL, url.c_str());
+
+ /* example.com is redirected, so we tell libcurl to follow redirection */
+ curl_easy_setopt(curl_, CURLOPT_FOLLOWLOCATION, 1L);
+ curl_easy_setopt(curl_, CURLOPT_NOSIGNAL, 1);
+ curl_easy_setopt(curl_, CURLOPT_ACCEPT_ENCODING, "deflate");
+
+ curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, write_data);
+ UserData data;
+ data.out = &out;
+ data.curl = curl_;
+ data.tcp = tcp_;
+ data.first_time = first_time;
+
+ curl_easy_setopt(curl_, CURLOPT_WRITEDATA, &data);
+
+ /* Perform the request, res will get the return code */
+ CURLcode res = curl_easy_perform(curl_);
+
+ /* Check for errors */
+ if (res != CURLE_OK) {
+ fprintf(stderr, "curl_easy_perform() failed: %s\n",
+ curl_easy_strerror(res));
+ return false;
+ }
+
+ return true;
+}
diff --git a/apps/http-server/http-client/http_client_tcp.h b/apps/http-server/http-client/http_client_tcp.h
new file mode 100644
index 000000000..9433e8a36
--- /dev/null
+++ b/apps/http-server/http-client/http_client_tcp.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2019 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "http_client.h"
+
+#include <string>
+
+class HTTPClientTcp : public HTTPClient {
+public:
+ HTTPClientTcp();
+
+ void setTcp();
+
+ ~HTTPClientTcp();
+
+ bool download(const std::string &url, std::ostream &out);
+
+private:
+ bool first_time;
+ bool tcp_;
+ void *curl_;
+};