webmock.cr
webmock.cr copied to clipboard
Request method comparison is case sensitive
I am building an integration and testing it with WebMock and run into this issue.
given I have this mock:
WebMock.stub(:get, "https://api.sandbox.paypal.com/v2/checkout/orders/ORDER_ID")
.to_return(body: {
"id" => "ID",
"status" => "COMPLETED",
}.to_json)
and this request:
HTTP::Client
.new(URI.parse("https://api.sandbox.paypal.com"))
.exec("get", "/v2/checkout/orders/ORDER_ID")
The request is not handled by WebMock, and the reason is that the method comparison is case sensitive: https://github.com/manastech/webmock.cr/blob/master/src/webmock/stub.cr#L66 in this case "get" == "GET"
I don't have time to fix it now, but I might do it later, using uppercase methods as a workaround now.
Your request is simply incorrect. According to RFC 7230 and RFC 2616 the request method token is case-sensitive. So you must use upper-case GET
. HTTP servers (and thus HTTP server mockups) should not try to autocorrect invalid requests, but fail with 400 Bad Request.
All right, so what is your suggestion here? Is this a Crystal HTTP::Client
issue? should it make sure that the request method is uppercase?
If it remains this way, maybe it should at least warn the user that it's not matching because it's lowercase or something like that? (for the next person who will run into this)
No, HTTP::Client should just pass through whatever it receives. And this would eventually lead to 400 Bad Request.
Maybe Webmock could intercept requests based on case-insensitive matching method and return 400 Bad Request.