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

test

parent c625dc48
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -667,6 +667,30 @@ libhttppp::HttpResponse libhttppp::HttpClient::GetStream(libhttppp::HttpRequest
        if (nreq.getRequestURL().empty())
            nreq.setRequestURL(_url.getPath());

        // HTTP/3 (QUIC) or HTTP/2: use full request, buffer response for streaming
        if (dynamic_cast<netplus::quic*>(_cltsock.get())) {
            auto data = _h3Request("GET", nreq);
            libhttppp::HttpResponse res;
            res.setContentLength(data.size());
            _streamBuf = std::move(data);
            _streamBufPos = 0;
            _streamMode = STREAM_CONTENT_LENGTH;
            _streamRemaining = _streamBuf.size();
            return res;
        }

        if (_isH2) {
            auto data = _h2Request("GET", nreq);
            libhttppp::HttpResponse res;
            res.setContentLength(data.size());
            _streamBuf = std::move(data);
            _streamBufPos = 0;
            _streamMode = STREAM_CONTENT_LENGTH;
            _streamRemaining = _streamBuf.size();
            return res;
        }

        // HTTP/1.x streaming path
        if (nreq.getRequestVersion().empty())
            nreq.setRequestVersion(HTTPVERSION(1.1));

+13 −1
Original line number Diff line number Diff line
@@ -138,7 +138,8 @@ namespace libhttppp {
                  const std::vector<char> *postBody = nullptr);

      // Streaming state
      enum StreamMode { STREAM_NONE, STREAM_CONTENT_LENGTH, STREAM_CHUNKED, STREAM_EOF };
      enum StreamMode { STREAM_NONE, STREAM_CONTENT_LENGTH, STREAM_CHUNKED, STREAM_EOF,
                        STREAM_H2, STREAM_H3 };
      StreamMode _streamMode = STREAM_NONE;
      size_t _streamRemaining = 0;        // bytes left for content-length mode
      std::vector<char> _streamBuf;       // leftover data from header read
@@ -147,6 +148,17 @@ namespace libhttppp {
      bool _streamChunkDone = false;      // true after final 0-length chunk
      size_t _streamChunkRemaining = 0;   // bytes left in current chunk

      // HTTP/2 streaming state
      uint32_t _streamH2Sid = 0;          // stream ID for active H2 stream
      bool     _streamH2EndStream = false;
      std::vector<uint8_t> _streamH2Raw; // raw frame buffer

      // HTTP/3 streaming state
      uint64_t _streamH3Sid = 0;          // stream ID for active H3 stream
      bool     _streamH3EndStream = false;
      std::vector<uint8_t> _streamH3Raw; // raw frame buffer
      std::vector<char> _streamH3Body;   // decoded DATA frames not yet consumed

  private:
      HttpUrl _url;
      std::unique_ptr<netplus::socket> _cltsock;