Advertisement
Guest User

Untitled

a guest
Aug 17th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.63 KB | None | 0 0
  1. req->headers->value = std::string_view(req->headers->value.data(), std::max<int>(0, req->headers->value.length() - 9));
  2.  
  3. // the only caller of getHeaders
  4. template <int CONSUME_MINIMALLY>
  5. std::pair<int, void *> fenceAndConsumePostPadded(char *data, int length, void *user, HttpRequest *req, fu2::unique_function<void *(void *, HttpRequest *)> &requestHandler, fu2::unique_function<void *(void *, std::string_view, bool)> &dataHandler) {
  6. int consumedTotal = 0;
  7. data[length] = 'r';
  8.  
  9. for (int consumed; length && (consumed = getHeaders(data, data + length, req->headers)); ) {
  10. data += consumed;
  11. length -= consumed;
  12. consumedTotal += consumed;
  13.  
  14. req->headers->value = std::string_view(req->headers->value.data(), std::max<int>(0, req->headers->value.length() - 9));
  15.  
  16. /* Parse query */
  17. const char *querySeparatorPtr = (const char *) memchr(req->headers->value.data(), '?', req->headers->value.length());
  18. req->querySeparator = (querySeparatorPtr ? querySeparatorPtr : req->headers->value.data() + req->headers->value.length()) - req->headers->value.data();
  19.  
  20. /* If returned socket is not what we put in we need
  21. * to break here as we either have upgraded to
  22. * WebSockets or otherwise closed the socket. */
  23. void *returnedUser = requestHandler(user, req);
  24. if (returnedUser != user) {
  25. /* We are upgraded to WebSocket or otherwise broken */
  26. return {consumedTotal, returnedUser};
  27. }
  28.  
  29. // todo: do not check this for GET (get should not have a body)
  30. // todo: also support reading chunked streams
  31. std::string_view contentLengthString = req->getHeader("content-length");
  32. if (contentLengthString.length()) {
  33. remainingStreamingBytes = toUnsignedInteger(contentLengthString);
  34.  
  35. if (!CONSUME_MINIMALLY) {
  36. unsigned int emittable = std::min<unsigned int>(remainingStreamingBytes, length);
  37. dataHandler(user, std::string_view(data, emittable), emittable == remainingStreamingBytes);
  38. remainingStreamingBytes -= emittable;
  39.  
  40. data += emittable;
  41. length -= emittable;
  42. consumedTotal += emittable;
  43. }
  44. } else {
  45. /* Still emit an empty data chunk to signal no data */
  46. dataHandler(user, {}, true);
  47. }
  48.  
  49. if (CONSUME_MINIMALLY) {
  50. break;
  51. }
  52. }
  53. return {consumedTotal, user};
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement