From 2177e330b7385e964b3c50ba23b7a5abf0a78a68 Mon Sep 17 00:00:00 2001 From: Christophe Meessen Date: Mon, 15 Jun 2015 10:38:09 +0200 Subject: [PATCH] Changed Request::remote_endpoint_address to std::string. Modified parse_request too keep case of header parameters. --- http_examples.cpp | 2 +- https_examples.cpp | 2 +- server_http.hpp | 14 ++++++++------ test/parse_test.cpp | 25 ++++++++++--------------- 4 files changed, 20 insertions(+), 23 deletions(-) diff --git a/http_examples.cpp b/http_examples.cpp index c82be5b..56746b1 100644 --- a/http_examples.cpp +++ b/http_examples.cpp @@ -57,7 +57,7 @@ int main() { //Responds with request-information server.resource["^/info$"]["GET"]=[](HttpServer::Response& response, shared_ptr request) { stringstream content_stream; - content_stream << "

Request from " << request->remote_endpoint_address.to_string() << " (" << request->remote_endpoint_port << ")

"; + content_stream << "

Request from " << request->remote_endpoint_address << " (" << request->remote_endpoint_port << ")

"; content_stream << request->method << " " << request->path << " HTTP/" << request->http_version << "
"; for(auto& header: request->header) { content_stream << header.first << ": " << header.second << "
"; diff --git a/https_examples.cpp b/https_examples.cpp index a6dd353..8b010d7 100644 --- a/https_examples.cpp +++ b/https_examples.cpp @@ -57,7 +57,7 @@ int main() { //Responds with request-information server.resource["^/info$"]["GET"]=[](HttpsServer::Response& response, shared_ptr request) { stringstream content_stream; - content_stream << "

Request from " << request->remote_endpoint_address.to_string() << " (" << request->remote_endpoint_port << ")

"; + content_stream << "

Request from " << request->remote_endpoint_address << " (" << request->remote_endpoint_port << ")

"; content_stream << request->method << " " << request->path << " HTTP/" << request->http_version << "
"; for(auto& header: request->header) { content_stream << header.first << ": " << header.second << "
"; diff --git a/server_http.hpp b/server_http.hpp index 0e5b083..15f4b41 100644 --- a/server_http.hpp +++ b/server_http.hpp @@ -121,11 +121,11 @@ namespace SimpleWeb { std::istream content; - std::unordered_map header; + std::unordered_multimap header; std::smatch path_match; - boost::asio::ip::address remote_endpoint_address; + std::string remote_endpoint_address; unsigned short remote_endpoint_port; private: @@ -135,7 +135,7 @@ namespace SimpleWeb { void read_remote_endpoint_data(socket_type& socket) { try { - remote_endpoint_address=socket.lowest_layer().remote_endpoint().address(); + remote_endpoint_address=socket.lowest_layer().remote_endpoint().address().to_string(); remote_endpoint_port=socket.lowest_layer().remote_endpoint().port(); } catch(const std::exception& e) { @@ -266,14 +266,15 @@ namespace SimpleWeb { parse_request(request, request->content); //If content, read that as well - if(request->header.count("Content-Length")>0) { + const auto it=request->header.find("Content-Length"); + if(it!=request->header.end()) { //Set timeout on the following boost::asio::async-read or write function std::shared_ptr timer; if(timeout_content>0) timer=set_timeout_on_socket(socket, timeout_content); boost::asio::async_read(*socket, request->streambuf, - boost::asio::transfer_exactly(stoull(request->header["Content-Length"])-num_additional_bytes), + boost::asio::transfer_exactly(stoull(it->second)-num_additional_bytes), [this, socket, request, timer] (const boost::system::error_code& ec, size_t /*bytes_transferred*/) { if(timeout_content>0) @@ -306,7 +307,8 @@ namespace SimpleWeb { if(line[value_start]==' ') value_start++; - request->header[line.substr(0, param_end)]=line.substr(value_start, line.size()-value_start-1); + std::string key=line.substr(0, param_end); + request->header.insert(std::make_pair(key, line.substr(value_start, line.size()-value_start-1))); getline(stream, line); param_end=line.find(':'); diff --git a/test/parse_test.cpp b/test/parse_test.cpp index 68c13c9..ce84f00 100644 --- a/test/parse_test.cpp +++ b/test/parse_test.cpp @@ -34,14 +34,11 @@ public: if(request->header.size()!=2) return 0; - if(request->header.count("TestHeader")==0) + auto header_it=request->header.find("TestHeader"); + if(header_it==request->header.end() || header_it->second!="test") return 0; - if(request->header["TestHeader"]!="test") - return 0; - - if(request->header.count("TestHeader2")==0) - return 0; - if(request->header["TestHeader2"]!="test2") + header_it=request->header.find("TestHeader2"); + if(header_it==request->header.end() || header_it->second!="test2") return 0; return 1; @@ -90,15 +87,13 @@ public: if(response->header.size()!=2) return 0; - if(response->header.count("TestHeader")==0) - return 0; - if(response->header["TestHeader"]!="test") - return 0; - if(response->header.count("TestHeader2")==0) - return 0; - if(response->header["TestHeader2"]!="test2") - return 0; + auto header_it=response->header.find("TestHeader"); + if(header_it==response->header.end() || header_it->second!="test") + return 0; + header_it=response->header.find("TestHeader2"); + if(header_it==response->header.end() || header_it->second!="test2") + return 0; return 1; }