Fork 0

Add Host header into target uri

Previously this would lead to an abort for an empty path (`/`), because
`http:/` cannot be parsed correctly.
The URI becomes the `target` in `request`, so it seems best to add the
`Host` header value too.

Note that this is still not 100% correct:
HTTP headers are case-insensitive, so it could also be `host:` or `HoSt`.
Right now headers are not normalized.
However it will not abort if `Host` is missing:
In that case `header_get` returns an empty string and then `http:///`
(three slashes) is parsed with an empty host name as expected.
This commit is contained in:
Jan-Erik Rediger 2024-05-27 22:49:29 +02:00
parent 9237448725
commit 53a13840bd

View file

@ -149,7 +149,8 @@ export fn request_parse(file: io::handle) (request | protoerr | io::error) = {
case let uri: authority => return errors::unsupported;
case let uri: *uri::uri => yield uri;
case let path: str =>
const uri = fmt::asprintf("http:{}", path);
const host = header_get(&header, "Host");
const uri = fmt::asprintf("http://{}{}", host, path);
defer free(uri);
yield alloc(uri::parse(uri)!);