diff --git a/src/HttpContext.h b/src/HttpContext.h index 5ec9148..be8a8e1 100644 --- a/src/HttpContext.h +++ b/src/HttpContext.h @@ -168,9 +168,9 @@ private: /* Continue parsing */ return s; - }, [httpResponseData](void *user, std::string_view data) -> void * { + }, [httpResponseData](void *user, std::string_view data, bool fin) -> void * { if (httpResponseData->inStream) { - httpResponseData->inStream(data); + httpResponseData->inStream(data, fin); /* Was the socket closed? */ if (us_socket_is_closed((struct us_socket *) user)) { diff --git a/src/HttpParser.h b/src/HttpParser.h index 670cc88..206ecd9 100644 --- a/src/HttpParser.h +++ b/src/HttpParser.h @@ -127,7 +127,7 @@ private: // the only caller of getHeaders template - std::pair fenceAndConsumePostPadded(char *data, int length, void *user, HttpRequest *req, std::function &requestHandler, std::function &dataHandler) { + std::pair fenceAndConsumePostPadded(char *data, int length, void *user, HttpRequest *req, std::function &requestHandler, std::function &dataHandler) { int consumedTotal = 0; data[length] = '\r'; @@ -161,7 +161,7 @@ private: if (!CONSUME_MINIMALLY) { int emittable = std::min(remainingStreamingBytes, length); - dataHandler(user, std::string_view(data, emittable)); + dataHandler(user, std::string_view(data, emittable), length == remainingStreamingBytes); remainingStreamingBytes -= emittable; data += emittable; @@ -180,7 +180,7 @@ private: public: // todo: what can we do with the socket inside the handlers? we need to check on return from any handler if we closed or terminated or upgraded the socket - void *consumePostPadded(char *data, int length, void *user, std::function &&requestHandler, std::function &&dataHandler, std::function &&errorHandler) { + void *consumePostPadded(char *data, int length, void *user, std::function &&requestHandler, std::function &&dataHandler, std::function &&errorHandler) { HttpRequest req; @@ -188,11 +188,11 @@ public: // this is exactly the same as below! if (remainingStreamingBytes >= length) { - void *returnedUser = dataHandler(user, std::string_view(data, length)); + void *returnedUser = dataHandler(user, std::string_view(data, length), false); remainingStreamingBytes -= length; return returnedUser; } else { - void *returnedUser = dataHandler(user, std::string_view(data, remainingStreamingBytes)); + void *returnedUser = dataHandler(user, std::string_view(data, remainingStreamingBytes), true); data += remainingStreamingBytes; length -= remainingStreamingBytes; @@ -228,11 +228,11 @@ public: if (remainingStreamingBytes) { // this is exactly the same as above! if (remainingStreamingBytes >= length) { - void *returnedUser = dataHandler(user, std::string_view(data, length)); + void *returnedUser = dataHandler(user, std::string_view(data, length), false); remainingStreamingBytes -= length; return returnedUser; } else { - void *returnedUser = dataHandler(user, std::string_view(data, remainingStreamingBytes)); + void *returnedUser = dataHandler(user, std::string_view(data, remainingStreamingBytes), true); data += remainingStreamingBytes; length -= remainingStreamingBytes; diff --git a/src/HttpResponse.h b/src/HttpResponse.h index 1bdbb9c..fd3a278 100644 --- a/src/HttpResponse.h +++ b/src/HttpResponse.h @@ -243,9 +243,8 @@ public: return this; } - // onData(chunk, remaining == -1 or 0 or actual remaining)? - /* Attach a read handler for data sent. Will be called with a chunk of size 0 when FIN */ - void read(std::function handler) { + /* Attach a read handler for data sent. Will be called with FIN set true if last segment. */ + void onData(std::function handler) { HttpResponseData *data = getHttpResponseData(); data->inStream = handler; } diff --git a/src/HttpResponseData.h b/src/HttpResponseData.h index a9f8b12..e8441b8 100644 --- a/src/HttpResponseData.h +++ b/src/HttpResponseData.h @@ -44,7 +44,7 @@ private: std::function onAborted; //std::function onData; - std::function inStream; + std::function inStream; std::function(int)> outStream; /* Outgoing offset */ int offset = 0;