From 2f57713f83d686cca0419f294e0bc421dda693e1 Mon Sep 17 00:00:00 2001 From: Mauro Sardara Date: Fri, 24 May 2019 16:55:21 +0200 Subject: [HICN-206] Customize first part of the name for HTTP. Change-Id: Ic2dd9cfce5b7d4eb82bef15cc40da16ea99230d8 Signed-off-by: Mauro Sardara --- apps/higet/higet.cc | 21 ++++++++++++++------- apps/http-proxy/main.cc | 19 ++++++++++++------- apps/http-proxy/src/IcnReceiver.cc | 15 +++++++-------- apps/http-proxy/src/IcnReceiver.h | 3 ++- .../src/hicn/transport/http/client_connection.cc | 16 +++++++++------- .../src/hicn/transport/http/client_connection.h | 9 ++++++--- 6 files changed, 50 insertions(+), 33 deletions(-) diff --git a/apps/higet/higet.cc b/apps/higet/higet.cc index 7662c1a2b..fa19528f8 100644 --- a/apps/higet/higet.cc +++ b/apps/higet/higet.cc @@ -31,6 +31,7 @@ typedef struct { std::string file_name; bool print_headers; std::string producer_certificate; + std::string ipv6_first_word; } Configuration; void processResponse(Configuration &conf, @@ -90,6 +91,9 @@ void usage(char *program_name) { << std::endl; std::cerr << "-S = print server response" << std::endl; + std::cerr << "-P = first word of the ipv6 name of " + "the response" + << std::endl; std::cerr << "example:" << std::endl; std::cerr << "\t" << program_name << " -O - http://origin/index.html" << std::endl; @@ -106,11 +110,12 @@ int main(int argc, char **argv) { conf.file_name = ""; conf.print_headers = false; conf.producer_certificate = ""; + conf.ipv6_first_word = "b001"; std::string name("http://webserver/sintel/mpd"); int opt; - while ((opt = getopt(argc, argv, "O:Sc:")) != -1) { + while ((opt = getopt(argc, argv, "O:Sc:P:")) != -1) { switch (opt) { case 'O': conf.file_name = optarg; @@ -121,6 +126,9 @@ int main(int argc, char **argv) { case 'c': conf.producer_certificate = optarg; break; + case 'P': + conf.ipv6_first_word = optarg; + break; case 'h': default: usage(argv[0]); @@ -128,11 +136,10 @@ int main(int argc, char **argv) { } } - if (argv[optind] == 0) { - std::cerr << "Using default name " << name << std::endl; - } else { - name = argv[optind]; - } + name = argv[optind]; + + std::cerr << "Using name " << name << " and name first word " + << conf.ipv6_first_word << std::endl; if (conf.file_name.empty()) { conf.file_name = name.substr(1 + name.find_last_of("/")); @@ -149,7 +156,7 @@ int main(int argc, char **argv) { t1 = std::chrono::system_clock::now(); - connection.get(name, headers); + connection.get(name, headers, {}, nullptr, nullptr, conf.ipv6_first_word); processResponse(conf, connection.response()); #ifdef _WIN32 diff --git a/apps/http-proxy/main.cc b/apps/http-proxy/main.cc index a7020298b..8dfaec77e 100644 --- a/apps/http-proxy/main.cc +++ b/apps/http-proxy/main.cc @@ -19,10 +19,11 @@ using namespace transport; int usage(char* program) { std::cerr << "ICN Plugin not loaded!" << std::endl; - std::cerr << "USAGE: " << program << "\n" - << "[HTTP_PREFIX] -a [SERVER_IP_ADDRESS] " - "-p [SERVER_PORT] -c [CACHE_SIZE] -m [MTU]" - << std::endl; + std::cerr + << "USAGE: " << program << "\n" + << "[HTTP_PREFIX] -a [SERVER_IP_ADDRESS] " + "-p [SERVER_PORT] -c [CACHE_SIZE] -m [MTU] -P [FIRST_IPv6_WORD_HEX]" + << std::endl; return -1; } @@ -32,9 +33,10 @@ int main(int argc, char** argv) { std::string port("80"); std::string cache_size("50000"); std::string mtu("1500"); + std::string first_ipv6_word("b001"); int opt; - while ((opt = getopt(argc, argv, "a:p:c:m:")) != -1) { + while ((opt = getopt(argc, argv, "a:p:c:m:P:")) != -1) { switch (opt) { case 'a': ip_address = optarg; @@ -48,6 +50,9 @@ int main(int argc, char** argv) { case 'm': mtu = optarg; break; + case 'P': + first_ipv6_word = optarg; + break; case 'h': default: return usage(argv[0]); @@ -63,9 +68,9 @@ int main(int argc, char** argv) { std::cout << "Connecting to " << ip_address << " port " << port << " Cache size " << cache_size << " Prefix " << prefix << " MTU " - << mtu << std::endl; + << mtu << " IPv6 first word " << first_ipv6_word << std::endl; transport::AsyncConsumerProducer proxy(prefix, ip_address, port, cache_size, - mtu); + mtu, first_ipv6_word); proxy.run(); diff --git a/apps/http-proxy/src/IcnReceiver.cc b/apps/http-proxy/src/IcnReceiver.cc index d4e922c11..18553d84b 100644 --- a/apps/http-proxy/src/IcnReceiver.cc +++ b/apps/http-proxy/src/IcnReceiver.cc @@ -24,7 +24,8 @@ namespace transport { -core::Prefix generatePrefix(const std::string& prefix_url) { +core::Prefix generatePrefix(const std::string& prefix_url, + std::string& first_ipv6_word) { const char* str = prefix_url.c_str(); uint16_t pos = 0; @@ -39,7 +40,7 @@ core::Prefix generatePrefix(const std::string& prefix_url) { uint32_t locator_hash = utils::hash::fnv32_buf(str, strlen(str)); std::stringstream stream; - stream << std::hex << http::default_values::ipv6_first_word << ":0"; + stream << first_ipv6_word << ":0"; for (uint16_t* word = (uint16_t*)&locator_hash; std::size_t(word) < (std::size_t(&locator_hash) + sizeof(locator_hash)); @@ -52,12 +53,10 @@ core::Prefix generatePrefix(const std::string& prefix_url) { return core::Prefix(stream.str(), 64); } -AsyncConsumerProducer::AsyncConsumerProducer(const std::string& prefix, - std::string& ip_address, - std::string& port, - std::string& cache_size, - std::string& mtu) - : prefix_(generatePrefix(prefix)), +AsyncConsumerProducer::AsyncConsumerProducer( + const std::string& prefix, std::string& ip_address, std::string& port, + std::string& cache_size, std::string& mtu, std::string& first_ipv6_word) + : prefix_(generatePrefix(prefix, first_ipv6_word)), producer_socket_(), ip_address_(ip_address), port_(port), diff --git a/apps/http-proxy/src/IcnReceiver.h b/apps/http-proxy/src/IcnReceiver.h index ea4eeb010..67f615ad7 100644 --- a/apps/http-proxy/src/IcnReceiver.h +++ b/apps/http-proxy/src/IcnReceiver.h @@ -35,7 +35,8 @@ class AsyncConsumerProducer { public: explicit AsyncConsumerProducer(const std::string& prefix, std::string& ip_address, std::string& port, - std::string& cache_size, std::string& mtu); + std::string& cache_size, std::string& mtu, + std::string& first_ipv6_word); void start(); diff --git a/libtransport/src/hicn/transport/http/client_connection.cc b/libtransport/src/hicn/transport/http/client_connection.cc index fadf0ae44..32269d49d 100644 --- a/libtransport/src/hicn/transport/http/client_connection.cc +++ b/libtransport/src/hicn/transport/http/client_connection.cc @@ -47,15 +47,16 @@ HTTPClientConnection::HTTPClientConnection() HTTPClientConnection::RC HTTPClientConnection::get( const std::string &url, HTTPHeaders headers, HTTPPayload payload, - std::shared_ptr response, ReadBytesCallback *callback) { - return sendRequest(url, HTTPMethod::GET, headers, payload, response, - callback); + std::shared_ptr response, ReadBytesCallback *callback, + std::string ipv6_first_word) { + return sendRequest(url, HTTPMethod::GET, headers, payload, response, callback, + ipv6_first_word); } HTTPClientConnection::RC HTTPClientConnection::sendRequest( const std::string &url, HTTPMethod method, HTTPHeaders headers, HTTPPayload payload, std::shared_ptr response, - ReadBytesCallback *callback) { + ReadBytesCallback *callback, std::string ipv6_first_word) { current_url_ = url; read_bytes_callback_ = callback; if (!response) { @@ -82,12 +83,13 @@ HTTPClientConnection::RC HTTPClientConnection::sendRequest( return response; }; - sendRequestGetReply(request, response); + sendRequestGetReply(request, response, ipv6_first_word); return return_code_; } void HTTPClientConnection::sendRequestGetReply( - const HTTPRequest &request, std::shared_ptr &response) { + const HTTPRequest &request, std::shared_ptr &response, + std::string &ipv6_first_word) { const std::string &request_string = request.getRequestString(); const std::string &locator = request.getLocator(); @@ -107,7 +109,7 @@ void HTTPClientConnection::sendRequestGetReply( // Factor hicn name using hash name_.str(""); - name_ << std::hex << http::default_values::ipv6_first_word << ":"; + name_ << ipv6_first_word << ":"; for (uint16_t *word = (uint16_t *)&locator_hash; std::size_t(word) < (std::size_t(&locator_hash) + sizeof(locator_hash)); diff --git a/libtransport/src/hicn/transport/http/client_connection.h b/libtransport/src/hicn/transport/http/client_connection.h index d0624702f..5bcf9c4c7 100644 --- a/libtransport/src/hicn/transport/http/client_connection.h +++ b/libtransport/src/hicn/transport/http/client_connection.h @@ -49,12 +49,14 @@ class HTTPClientConnection : public ConsumerSocket::ReadCallback { RC get(const std::string &url, HTTPHeaders headers = {}, HTTPPayload payload = {}, std::shared_ptr response = nullptr, - ReadBytesCallback *callback = nullptr); + ReadBytesCallback *callback = nullptr, + std::string ipv6_first_word = "b001"); RC sendRequest(const std::string &url, HTTPMethod method, HTTPHeaders headers = {}, HTTPPayload payload = {}, std::shared_ptr response = nullptr, - ReadBytesCallback *callback = nullptr); + ReadBytesCallback *callback = nullptr, + std::string ipv6_first_word = "b001"); HTTPResponse response(); @@ -68,7 +70,8 @@ class HTTPClientConnection : public ConsumerSocket::ReadCallback { private: void sendRequestGetReply(const HTTPRequest &request, - std::shared_ptr &response); + std::shared_ptr &response, + std::string &ipv6_first_word); bool verifyData(interface::ConsumerSocket &c, const core::ContentObject &contentObject); -- cgit 1.2.3-korg