1. 09 Feb, 2019 1 commit
  2. 04 Feb, 2019 1 commit
  3. 22 Jan, 2019 7 commits
    • Kenton Varda's avatar
      1325f3c2
    • Kenton Varda's avatar
      Fix http-socketpair-test failure in WebSocket piping. · a90c65f4
      Kenton Varda authored
      The test "WebSocket pump disconnect on send" tests what happens if a send() throws DISCONNECTED while pumping. The test hung forever with socketpairs because the message fits entirely in the socket's send buffer, and thus send() actually completes before the disconnect occurs. This differs from userspace pipes, where there is no buffering, and so the send() doesn't complete until all data is received.
      
      This could be fixed by sending a very large message, so that the send() actually blocks on the receiver. But, the problem reveals that WebSocket pumps won't notice when the destination disconnects unless the source sends some message through. Now that we have whenWriteDisconnected(), we can fix this and proactively end the pump, which also fixes the test.
      
      In fact, we can and should propagate such disconnects backwards: if the destination disconnects, we should close the source. We can do this by adding an abort() method to WebSocket, which incidentally allows us to remove the internal AbortableWebSocket interface which was used specifically by WebSocketPipeImpl.
      a90c65f4
    • Kenton Varda's avatar
    • Kenton Varda's avatar
      Proactively cancel HTTP service when client disconnects. · 674fe0c1
      Kenton Varda authored
      This prevents a hanging service from being a permanent memory leak -- as long as the client is still there waiting.
      
      (TCP servers will need additionally to apply connection-level timeouts/keepalives to detect disappearing clients.)
      674fe0c1
    • Kenton Varda's avatar
      Implement whenWriteDisconnected() everywhere. · 0b9f906e
      Kenton Varda authored
      I decided to make the new method pure-virtual as I wanted to make sure that all wrapper streams properly delegate to the inner stream. We wouldn't want e.g. proactive HTTP cancellation to unexpectedly not work when running over TLS.
      0b9f906e
    • Kenton Varda's avatar
      WebSocket pump() should end at Close message. · 3fcd0f46
      Kenton Varda authored
      This reverts the core change from: https://github.com/capnproto/capnproto/commit/6e4c5ce3c9f31a5e79b50cd9eaae6d03106edf98
      
      There are a few reasons to believe that change was wrong:
      - It meant that a pump would always throw and catch a DISCONNECTED exception, which violates the rule that we don't throw exceptions in "normal" operation.
      - It could lead to trouble when combined with the previous commit, which could delay WebSocket disconnect until the service "completes" -- which would lead to a hang.
      
      The commit message where I introduced this said something about bad behavior on OSX. We should address that directly, if it is still a problem.
      3fcd0f46
    • Kenton Varda's avatar
      Fix HttpClient-from-HttpService wrapper prematurely cancelling service promise. · 90d48343
      Kenton Varda authored
      The client app will typically discard the returned response body upon reading EOF. However, the server app may not actually be "done" with the service callback yet at this point. Usually it completes very soon after, but it may need another turn or two of the event loop. If the client discards the response body stream, the server-side promise is discarded, cancelling whatever was left. This is awkward, so we should instead delay the client from seeing EOF until the server has actually finished up.
      90d48343
  4. 29 Nov, 2018 1 commit
  5. 26 Nov, 2018 1 commit
  6. 21 Nov, 2018 1 commit
    • Kenton Varda's avatar
      Extend kj::Url with option to not collapse empty path/query components. · a358282e
      Kenton Varda authored
      This is to fix a complaint about Cloudflare Workers removing these components as requests pass through, which apparently breaks someone's funky URLs.
      
      Arguably "." and ".." processing presents a similar problems. But, allowing ".." to pass through is much more likely to lead to security problems. Browsers will generally process "." and ".." before sending a request (whereas they won't collapse double-slashes), so we're following their lead here.
      a358282e
  7. 05 Nov, 2018 1 commit
    • Kenton Varda's avatar
      Allow WebSocket to keep sending after close(). · 308e5cda
      Kenton Varda authored
      In Cloudflare Workers, we've observed applications in the wild that continue to send messages after a Close message. This is incorrect, but it happens, and we end up logging a spurious error as we attempt to proxy the message through.
      
      By removing this restriction, we can now proxy these WebSockets despite the incorrect usage.
      308e5cda
  8. 12 Oct, 2018 1 commit
    • Harris Hancock's avatar
      Zero-length HTTP responses to HEAD get no Content-Length header · 48083d47
      Harris Hancock authored
      There is currently no way to explicitly omit a Content-Length/Transfer-Encoding header on an HTTP response to a HEAD request. This is awkward for a proxy, which would ideally pass along responses as-is, even if they have no such headers.
      
      This change allows an author to pass zero as the expected body length to HttpService::Response::send() to mean "do not set any body header." This means that a proxy might strip Content-Length: 0 headers, but will never add a Content-Length header where there was none before.
      48083d47
  9. 07 Oct, 2018 1 commit
    • Kenton Varda's avatar
      Make HttpInputStream reusable. · 513cd4e8
      Kenton Varda authored
      Some protocols, like Visual Studio Code's Language Server Protocol, have made the unfortunate decision to use HTTP-style message envelope even though they are not HTTP protocols. LSP, for example, sends each JSON-RPC messages as a Content-Length header followed by two CRLF followed by a JSON message of that length. I didn't want to rewrite HTTP parsing, so I extended the HTTP library to make this functionality reusable.
      513cd4e8
  10. 08 Sep, 2018 1 commit
  11. 31 Aug, 2018 1 commit
  12. 26 Aug, 2018 3 commits
  13. 19 Aug, 2018 2 commits
  14. 12 Aug, 2018 1 commit
  15. 10 Aug, 2018 1 commit
    • Harris Hancock's avatar
      Expose CONNECTION_HEADERS_COUNT in http.h · 1a8b95d1
      Harris Hancock authored
      To safely use HttpHeaders::serialize*() with overridden connection-level headers, dependent code must stay up-to-date with any changes in the builtin header list. We now expose CONNECTION_HEADERS_COUNT and its friends to facilitate this.
      1a8b95d1
  16. 05 Aug, 2018 2 commits
    • Kenton Varda's avatar
      Fix WebSocketPair pumpTo() behavior when other end is dropped. · f582e997
      Kenton Varda authored
      This should be treated as the other end disconnecting, not an error.
      
      This is not related to tables but is needed for the Cloudflare Workers runtime change I'm working on that also uses tables... so I'm throwing it into the same PR.
      f582e997
    • Kenton Varda's avatar
      GCC doesn't accept (void) to silence warn_unused_result. · f6df70e5
      Kenton Varda authored
      This is stupid, but the GCC maintainers refused to change it:
      
          https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425
      
      For some reason, KJ's uses of (void) did not warn with GCC 5 but do warn with GCC 7. Supposedly, GCC *never* supported silencing with (void), so there must have been some other bug that caused GCC to fail to trigger the warning previously -- maybe related to the fact that the values being returned are non-trivial types?
      
      C++17 introduces `[[nodiscard]]` which is defined as being squelchable using `(void)`, but we're still on C++14, and KJ_UNUSED_RESULT is a post-declaration attribute so can't be defined in terms of the new C++17 attribute even if the compiler supports it. Sigh.
      f6df70e5
  17. 25 Jun, 2018 1 commit
  18. 20 Jun, 2018 1 commit
    • Kenton Varda's avatar
      Fix handling of disconnect during WebSocket::pumpTo(). · ce83d192
      Kenton Varda authored
      Before this change, if *either* the `from` or the `to` end of the pump threw a DISCONNECTED exception, we'd then try to call `to.disconnect()`. But if the exception had been thrown from `to` in the first place, then this would throw again, this time complaining about a previous write not having completed. But the whole point was always to propagate errors from the *receiving* end to the sending end. An error on the sending end should just propagate up the stack.
      ce83d192
  19. 13 Jun, 2018 4 commits
  20. 09 Jun, 2018 1 commit
    • Kenton Varda's avatar
      Fix chunked body gather-write test. · b3096736
      Kenton Varda authored
      The braced array literals seem to be constructed as temporaries. The test passes in debug builds, but in optimized builds, the arrays have been overwritten by the time they are used.
      b3096736
  21. 07 Jun, 2018 2 commits
  22. 04 Jun, 2018 2 commits
  23. 02 Jun, 2018 1 commit
  24. 30 May, 2018 1 commit
  25. 15 May, 2018 1 commit