Commit ccd4048a authored by jan.koester's avatar jan.koester
Browse files

test

parent 595eb708
Loading
Loading
Loading
Loading
+32 −7
Original line number Diff line number Diff line
@@ -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();
@@ -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);

@@ -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 (...) {}
@@ -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;
                        }
@@ -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 {
@@ -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);

@@ -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);
@@ -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);

@@ -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())
+4 −0
Original line number Diff line number Diff line
@@ -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();

@@ -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;
  };