Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"Expect: 100-continue" header is using case-sensitive comparison #2708

Closed
JonathanMurray opened this issue Nov 30, 2021 · 0 comments
Closed
Labels
C-bug Category: bug. Something is wrong. This is bad!

Comments

@JonathanMurray
Copy link
Contributor

Version
0.14 (and master-branch 2021-11-30)

Platform
Darwin C02Y72T1JGH5 20.6.0 Darwin Kernel Version 20.6.0: Mon Aug 30 06:12:21 PDT 2021; root:xnu-7195.141.6~3/RELEASE_X86_64 x86_64

Description
I have a service built with Hyper that I'm now trying to communicate with from a client written in Java. I noticed when doing this that Java's standard HttpClient sends 100-continue expectations as Expect: 100-Continue (https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/src/java.net.http/share/classes/jdk/internal/net/http/Exchange.java#L408), whereas Hyper compares the expectation header value against 100-continue (case-sensitive) (

expect_continue = value.as_bytes() == b"100-continue";
). This has the effect that the Java client never receives a 100 Continue from the Rust service, which makes it seemingly unable to handle the response correctly. https://datatracker.ietf.org/doc/html/rfc2616#section-14.20 seems to state that the capitalisation of the 100-continue token should not matter from the server's perspective:

Comparison of expectation values is case-insensitive for unquoted
   tokens (including the 100-continue token), and is case-sensitive for
   quoted-string expectation-extensions.

Trying this:

changing the expect_continue_sends_100 test to send the request expectation with an upper-case C.

diff --git a/tests/server.rs b/tests/server.rs
index 13530a36..0b991337 100644
--- a/tests/server.rs
+++ b/tests/server.rs
@@ -808,7 +808,7 @@ fn expect_continue_sends_100() {
         b"\
         POST /foo HTTP/1.1\r\n\
         Host: example.domain\r\n\
-        Expect: 100-continue\r\n\
+        Expect: 100-Continue\r\n\
         Content-Length: 5\r\n\
         Connection: Close\r\n\
         \r\n\

and running cargo test --features full expect_continue_sends_100

I expect to see this happen:

test passes

Instead, this happens:

The test fails with:

---- expect_continue_sends_100 stdout ----
thread 'expect_continue_sends_100' panicked at 'read 1: Os { code: 35, kind: WouldBlock, message: "Resource temporarily unavailable" }', tests/server.rs:821:30
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-bug Category: bug. Something is wrong. This is bad!
Projects
None yet
Development

No branches or pull requests

1 participant