Loading src/http.cpp +32 −7 Original line number Diff line number Diff line Loading @@ -593,7 +593,8 @@ std::vector<char> libhttppp::HttpClient::_h1ReadResponse(const std::string &labe throw he; } // Store status code and Location for redirect handling // Store parsed response and extract fields for redirect handling _lastResponse = std::make_unique<HttpResponse>(res); _lastStatusCode = res.getStatusCode(); _lastLocation.clear(); _lastContentType.clear(); Loading Loading @@ -834,6 +835,7 @@ libhttppp::HttpResponse libhttppp::HttpClient::GetStream(libhttppp::HttpRequest std::stringstream host; host << _url.getHost() << ":" << _url.getPort(); if (!nreq.getHeaderData("host")) nreq.setHeaderData("host")->push_back(host.str()); nreq.setRequestType(GETREQUEST); Loading Loading @@ -2458,6 +2460,7 @@ const std::vector<char> libhttppp::HttpClient::_h2Request( auto headers = decoder.decode(payload, frame_len); _lastContentType.clear(); _lastLocation.clear(); _lastResponse = std::make_unique<HttpResponse>(); for (const auto &h : headers) { if (h.name == ":status") { try { _lastStatusCode = std::stoi(h.value); } catch (...) {} Loading @@ -2466,7 +2469,13 @@ const std::vector<char> libhttppp::HttpClient::_h2Request( } else if (h.name == "location") { _lastLocation = h.value; } if (!h.name.empty() && h.name[0] != ':') { _lastResponse->setHeaderData(h.name)->push_back(h.value); } } _lastResponse->setState(std::to_string(_lastStatusCode)); if (!_lastContentType.empty()) _lastResponse->setContentType(_lastContentType); if (frame_flags & H2C_FLAG_END_STREAM) { got_end_stream = true; } Loading Loading @@ -2687,18 +2696,30 @@ const std::vector<char> libhttppp::HttpClient::_h2Request( pos = frame_start; break; } else if (frame_type == 0x01) { auto decoded = qpack::Decoder::decode(raw.data() + pos, frame_len); _lastContentType.clear(); _lastLocation.clear(); _lastResponse = std::make_unique<HttpResponse>(); for (const auto &h : decoded) { if (h.name == ":status") { try { status_code = std::stoi(h.value); } catch (...) { status_code = 0; } try { status_code = std::stoi(h.value); _lastStatusCode = status_code; } catch (...) { status_code = 0; } } else if (h.name == "location") { location = h.value; _lastLocation = h.value; } else if (h.name == "content-length") { try { expected_body = static_cast<size_t>(std::stoul(h.value)); body.reserve(expected_body); } catch (...) {} } else if (h.name == "content-type") { _lastContentType = h.value; } if (!h.name.empty() && h.name[0] != ':') { _lastResponse->setHeaderData(h.name)->push_back(h.value); } } _lastResponse->setState(std::to_string(_lastStatusCode)); if (!_lastContentType.empty()) _lastResponse->setContentType(_lastContentType); got_headers = true; pos += frame_len; } else { Loading Loading @@ -2780,6 +2801,7 @@ const std::vector<char> libhttppp::HttpClient::Get(libhttppp::HttpRequest &nreq, std::stringstream host; host << _url.getHost() << ":" << _url.getPort(); if (!nreq.getHeaderData("host")) nreq.setHeaderData("host")->push_back(host.str()); nreq.setRequestType(GETREQUEST); Loading Loading @@ -2861,6 +2883,7 @@ const std::vector<char> libhttppp::HttpClient::Post(libhttppp::HttpRequest &nreq std::stringstream host; host << _url.getHost() << ":" << _url.getPort(); if (!nreq.getHeaderData("host")) nreq.setHeaderData("host")->push_back(host.str()); if (!convertedToGet) nreq.setRequestType(POSTREQUEST); Loading Loading @@ -2979,6 +3002,7 @@ const std::vector<char> libhttppp::HttpClient::Delete(libhttppp::HttpRequest &nr std::stringstream host; host << _url.getHost() << ":" << _url.getPort(); if (!nreq.getHeaderData("host")) nreq.setHeaderData("host")->push_back(host.str()); nreq.setRequestType(DELETEREQUEST); Loading Loading @@ -3036,6 +3060,7 @@ const std::vector<char> libhttppp::HttpClient::Put(libhttppp::HttpRequest &nreq, std::stringstream host; host << _url.getHost() << ":" << _url.getPort(); if (!nreq.getHeaderData("host")) nreq.setHeaderData("host")->push_back(host.str()); nreq.setRequestType(PUTREQUEST); if (nreq.getRequestURL().empty()) Loading src/http.h +4 −0 Original line number Diff line number Diff line Loading @@ -127,6 +127,9 @@ namespace libhttppp { // Returns the Content-Type from the last response. const std::string &lastContentType() const { return _lastContentType; } // Returns the full parsed response from the last request. const HttpResponse *lastResponse() const { return _lastResponse.get(); } // Drop the current connection so the next request opens a fresh one. void resetConnection(); Loading Loading @@ -200,6 +203,7 @@ namespace libhttppp { int _lastStatusCode = 0; std::string _lastLocation; std::string _lastContentType; std::unique_ptr<HttpResponse> _lastResponse; static constexpr int MAX_REDIRECTS = 5; int _maxRedirects = MAX_REDIRECTS; }; Loading Loading
src/http.cpp +32 −7 Original line number Diff line number Diff line Loading @@ -593,7 +593,8 @@ std::vector<char> libhttppp::HttpClient::_h1ReadResponse(const std::string &labe throw he; } // Store status code and Location for redirect handling // Store parsed response and extract fields for redirect handling _lastResponse = std::make_unique<HttpResponse>(res); _lastStatusCode = res.getStatusCode(); _lastLocation.clear(); _lastContentType.clear(); Loading Loading @@ -834,6 +835,7 @@ libhttppp::HttpResponse libhttppp::HttpClient::GetStream(libhttppp::HttpRequest std::stringstream host; host << _url.getHost() << ":" << _url.getPort(); if (!nreq.getHeaderData("host")) nreq.setHeaderData("host")->push_back(host.str()); nreq.setRequestType(GETREQUEST); Loading Loading @@ -2458,6 +2460,7 @@ const std::vector<char> libhttppp::HttpClient::_h2Request( auto headers = decoder.decode(payload, frame_len); _lastContentType.clear(); _lastLocation.clear(); _lastResponse = std::make_unique<HttpResponse>(); for (const auto &h : headers) { if (h.name == ":status") { try { _lastStatusCode = std::stoi(h.value); } catch (...) {} Loading @@ -2466,7 +2469,13 @@ const std::vector<char> libhttppp::HttpClient::_h2Request( } else if (h.name == "location") { _lastLocation = h.value; } if (!h.name.empty() && h.name[0] != ':') { _lastResponse->setHeaderData(h.name)->push_back(h.value); } } _lastResponse->setState(std::to_string(_lastStatusCode)); if (!_lastContentType.empty()) _lastResponse->setContentType(_lastContentType); if (frame_flags & H2C_FLAG_END_STREAM) { got_end_stream = true; } Loading Loading @@ -2687,18 +2696,30 @@ const std::vector<char> libhttppp::HttpClient::_h2Request( pos = frame_start; break; } else if (frame_type == 0x01) { auto decoded = qpack::Decoder::decode(raw.data() + pos, frame_len); _lastContentType.clear(); _lastLocation.clear(); _lastResponse = std::make_unique<HttpResponse>(); for (const auto &h : decoded) { if (h.name == ":status") { try { status_code = std::stoi(h.value); } catch (...) { status_code = 0; } try { status_code = std::stoi(h.value); _lastStatusCode = status_code; } catch (...) { status_code = 0; } } else if (h.name == "location") { location = h.value; _lastLocation = h.value; } else if (h.name == "content-length") { try { expected_body = static_cast<size_t>(std::stoul(h.value)); body.reserve(expected_body); } catch (...) {} } else if (h.name == "content-type") { _lastContentType = h.value; } if (!h.name.empty() && h.name[0] != ':') { _lastResponse->setHeaderData(h.name)->push_back(h.value); } } _lastResponse->setState(std::to_string(_lastStatusCode)); if (!_lastContentType.empty()) _lastResponse->setContentType(_lastContentType); got_headers = true; pos += frame_len; } else { Loading Loading @@ -2780,6 +2801,7 @@ const std::vector<char> libhttppp::HttpClient::Get(libhttppp::HttpRequest &nreq, std::stringstream host; host << _url.getHost() << ":" << _url.getPort(); if (!nreq.getHeaderData("host")) nreq.setHeaderData("host")->push_back(host.str()); nreq.setRequestType(GETREQUEST); Loading Loading @@ -2861,6 +2883,7 @@ const std::vector<char> libhttppp::HttpClient::Post(libhttppp::HttpRequest &nreq std::stringstream host; host << _url.getHost() << ":" << _url.getPort(); if (!nreq.getHeaderData("host")) nreq.setHeaderData("host")->push_back(host.str()); if (!convertedToGet) nreq.setRequestType(POSTREQUEST); Loading Loading @@ -2979,6 +3002,7 @@ const std::vector<char> libhttppp::HttpClient::Delete(libhttppp::HttpRequest &nr std::stringstream host; host << _url.getHost() << ":" << _url.getPort(); if (!nreq.getHeaderData("host")) nreq.setHeaderData("host")->push_back(host.str()); nreq.setRequestType(DELETEREQUEST); Loading Loading @@ -3036,6 +3060,7 @@ const std::vector<char> libhttppp::HttpClient::Put(libhttppp::HttpRequest &nreq, std::stringstream host; host << _url.getHost() << ":" << _url.getPort(); if (!nreq.getHeaderData("host")) nreq.setHeaderData("host")->push_back(host.str()); nreq.setRequestType(PUTREQUEST); if (nreq.getRequestURL().empty()) Loading
src/http.h +4 −0 Original line number Diff line number Diff line Loading @@ -127,6 +127,9 @@ namespace libhttppp { // Returns the Content-Type from the last response. const std::string &lastContentType() const { return _lastContentType; } // Returns the full parsed response from the last request. const HttpResponse *lastResponse() const { return _lastResponse.get(); } // Drop the current connection so the next request opens a fresh one. void resetConnection(); Loading Loading @@ -200,6 +203,7 @@ namespace libhttppp { int _lastStatusCode = 0; std::string _lastLocation; std::string _lastContentType; std::unique_ptr<HttpResponse> _lastResponse; static constexpr int MAX_REDIRECTS = 5; int _maxRedirects = MAX_REDIRECTS; }; Loading