webmock.cr icon indicating copy to clipboard operation
webmock.cr copied to clipboard

Request method comparison is case sensitive

Open gdotdesign opened this issue 4 years ago • 3 comments

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.

gdotdesign avatar Jan 24 '20 10:01 gdotdesign

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.

straight-shoota avatar Jan 24 '20 14:01 straight-shoota

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)

gdotdesign avatar Jan 25 '20 04:01 gdotdesign

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.

straight-shoota avatar Jan 25 '20 23:01 straight-shoota