From 48d74a974ad973049937e502825048cbcd6feabe Mon Sep 17 00:00:00 2001 From: eidheim Date: Sun, 25 Jun 2017 09:21:00 +0200 Subject: [PATCH] Server::Response::write convenience functions now always add Content-Length header field if it does not exists and if chunked transfer encoding is not used --- server_http.hpp | 16 ++++++++++------ tests/io_test.cpp | 3 ++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/server_http.hpp b/server_http.hpp index ef2fba1..0e9b965 100644 --- a/server_http.hpp +++ b/server_http.hpp @@ -57,14 +57,18 @@ namespace SimpleWeb { Response(const std::shared_ptr &socket): std::ostream(&streambuf), socket(socket) {} template - void write_header(const CaseInsensitiveMultimap &header, size_type size=0) { + void write_header(const CaseInsensitiveMultimap &header, size_type size) { bool content_length_written=false; - for(auto &header_field: header) { - if(size && !content_length_written && case_insensitive_equal(header_field.first, "content-length")) - content_length_written=true; - *this << header_field.first << ": " << header_field.second << "\r\n"; + bool chunked_transfer_encoding=false; + for(auto &field: header) { + if(!content_length_written && case_insensitive_equal(field.first, "content-length")) + content_length_written=true; + else if(!chunked_transfer_encoding && case_insensitive_equal(field.first, "transfer-encoding") && case_insensitive_equal(field.second, "chunked")) + chunked_transfer_encoding=true; + + *this << field.first << ": " << field.second << "\r\n"; } - if(size && !content_length_written) + if(!content_length_written && !chunked_transfer_encoding) *this << "Content-Length: " << size << "\r\n\r\n"; else *this << "\r\n"; diff --git a/tests/io_test.cpp b/tests/io_test.cpp index ac3bbad..39cbec3 100644 --- a/tests/io_test.cpp +++ b/tests/io_test.cpp @@ -97,9 +97,10 @@ int main() { stringstream output; auto r=client.request("POST", "/string4", "A string"); assert(SimpleWeb::status_code(r->status_code)==SimpleWeb::StatusCode::client_error_forbidden); - assert(r->header.size()==2); + assert(r->header.size()==3); assert(r->header.find("test1")->second=="test2"); assert(r->header.find("tEst3")->second=="test4"); + assert(r->header.find("content-length")->second=="0"); output << r->content.rdbuf(); assert(output.str()==""); }