aboutsummaryrefslogtreecommitdiffstats
path: root/http-client
diff options
context:
space:
mode:
Diffstat (limited to 'http-client')
-rw-r--r--http-client/http_client.h24
-rw-r--r--http-client/http_client_icn.cc41
-rw-r--r--http-client/http_client_icn.h34
-rw-r--r--http-client/http_client_tcp.cc99
-rw-r--r--http-client/http_client_tcp.h35
5 files changed, 219 insertions, 14 deletions
diff --git a/http-client/http_client.h b/http-client/http_client.h
index 19d3c41e..9bd998bd 100644
--- a/http-client/http_client.h
+++ b/http-client/http_client.h
@@ -13,23 +13,19 @@
* limitations under the License.
*/
-#ifndef HTTP_CLIENT_H_
-#define HTTP_CLIENT_H_
+#pragma once
+
+#include "config.h"
#include <string>
+# include <icnet/icnet_http_facade.h>
+
class HTTPClient {
public:
- HTTPClient();
- ~HTTPClient();
- /**
- * Download a file using HTTP GET and store in in a std::string
- * @param url The URL to download
- * @return The download result
- */
- bool download(const std::string& url, std::ostream& out);
- private:
- void* curl_;
-};
+ virtual ~HTTPClient() = default;
-#endif // HTTP_CLIENT_H_ \ No newline at end of file
+ virtual void setTcp() = 0;
+
+ virtual bool download(const std::string &url, std::ostream &out) = 0;
+};
diff --git a/http-client/http_client_icn.cc b/http-client/http_client_icn.cc
new file mode 100644
index 00000000..88294f80
--- /dev/null
+++ b/http-client/http_client_icn.cc
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2017 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/http-client/http_client_icn.h b/http-client/http_client_icn.h
new file mode 100644
index 00000000..67cc499c
--- /dev/null
+++ b/http-client/http_client_icn.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2017 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/http-client/http_client_tcp.cc b/http-client/http_client_tcp.cc
new file mode 100644
index 00000000..ec83cd66
--- /dev/null
+++ b/http-client/http_client_tcp.cc
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2017 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 <sstream>
+#include <iostream>
+#include <string.h>
+#include <stdio.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->tcp && 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/http-client/http_client_tcp.h b/http-client/http_client_tcp.h
new file mode 100644
index 00000000..b8324717
--- /dev/null
+++ b/http-client/http_client_tcp.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2017 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_;
+};