diff options
| author | 2022-12-01 21:15:34 -0800 | |
|---|---|---|
| committer | 2022-12-01 21:15:34 -0800 | |
| commit | 9f4d7690ace86048abad38cfaf51eb99e944449b (patch) | |
| tree | d39cc4cd0450d7a96a7d0ad3a97e623f73ce7121 | |
| parent | 5854d395259f4084b1d66e9f12b54085f277527e (diff) | |
| download | bun-9f4d7690ace86048abad38cfaf51eb99e944449b.tar.gz bun-9f4d7690ace86048abad38cfaf51eb99e944449b.tar.zst bun-9f4d7690ace86048abad38cfaf51eb99e944449b.zip | |
[fetch] Treat 302 like 303
| -rw-r--r-- | src/http_client_async.zig | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/http_client_async.zig b/src/http_client_async.zig index 11150ef50..b946c3aa6 100644 --- a/src/http_client_async.zig +++ b/src/http_client_async.zig @@ -1967,7 +1967,7 @@ pub fn handleResponseMetadata( const is_redirect = this.state.pending_response.status_code >= 300 and this.state.pending_response.status_code <= 399; - if (location.len > 0 and this.remaining_redirect_count > 0 and this.follow_redirects) { + if (is_redirect and this.follow_redirects and location.len > 0 and this.remaining_redirect_count > 0) { switch (this.state.pending_response.status_code) { 302, 301, 307, 308, 303 => { if (strings.indexOf(location, "://")) |i| { @@ -2049,8 +2049,23 @@ pub fn handleResponseMetadata( this.redirect = url_buf; } + // Note: RFC 1945 and RFC 2068 specify that the client is not allowed to change + // the method on the redirected request. However, most existing user agent + // implementations treat 302 as if it were a 303 response, performing a GET on + // the Location field-value regardless of the original request method. The + // status codes 303 and 307 have been added for servers that wish to make + // unambiguously clear which kind of reaction is expected of the client. + if (response.status_code == 302) { + switch (this.method) { + .GET, .HEAD => {}, + else => { + this.method = .GET; + }, + } + } + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/303 - if (response.status_code == 303) { + if (response.status_code == 303 and this.method != .HEAD) { this.method = .GET; } |
