Skip to content

get route macro does not result in HEAD request support #2702

Description

@ijackson

Example test case

#[get("/foo")]
async fn foo() -> impl Responder {
  "foo\r\n"
}

Current Behavior

$ curl -v http://localhost:8080/foo
...
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55e8ff381fb0)
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /foo HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< content-length: 5
< content-type: text/plain; charset=utf-8
< date: Sat, 19 Mar 2022 18:30:00 GMT
< 
foo
* Connection #0 to host localhost left intact
$ curl -v -I http://localhost:8080/foo
...
* Expire in 0 ms for 1 (transfer 0x55f159685fb0)
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55f159685fb0)
* Connected to localhost (127.0.0.1) port 8080 (#0)
> HEAD /foo HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.0
> Accept: */*
> 
< HTTP/1.1 404 Not Found
HTTP/1.1 404 Not Found
< content-length: 0
content-length: 0
< date: Sat, 19 Mar 2022 18:30:58 GMT
date: Sat, 19 Mar 2022 18:30:58 GMT

< 
* Connection #0 to host localhost left intact
$ 

Expected Behavior

The HEAD request is implemented according to the RFC specification.

I can obtain the expected behaviour by writing:

#[route("/foo", method="GET", method="HEAD")]

but this is not ergonomic.

Possible Solutions

  1. Make the get macro work like #[route("/foo", method="GET", method="HEAD")] (and adjust documentation accordingly). This would mean that if an application author writes the obvious code, it is also correct.

  2. Provide a new macro that behaves like #[route("/foo", method="GET", method="HEAD")], and try to discourage application authors from using #[get].

References

MDN, RFC7231 4.3.2.

Your Environment

  • Rust Version (I.e, output of rustc -V): rustc 1.61.0-nightly (1bfe40d11 2022-03-18)
  • Actix Web Version: 4.0.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-webproject: actix-webC-improvementCategory: an improvement to existing functionalityhelp-wanted

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions