diff options
Diffstat (limited to 'src/io/loader.nim')
-rw-r--r-- | src/io/loader.nim | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/io/loader.nim b/src/io/loader.nim index 71cfd2ff..4931d40b 100644 --- a/src/io/loader.nim +++ b/src/io/loader.nim @@ -130,9 +130,22 @@ proc doRequest*(loader: FileLoader, request: Request, blocking = true): Response else: result.contenttype = guessContentType($request.url.path) if "Location" in result.headers.table: - if result.status in [201, 301, 302, 303, 307, 308]: + if result.status in 301..303 or result.status in 307..308: let location = result.headers.table["Location"][0] - result.redirect = parseUrl(location, some(request.url)) + let url = parseUrl(location, some(request.url)) + if url.isSome: + if (result.status == 303 and + request.httpmethod notin {HTTP_GET, HTTP_HEAD}) or + (result.status == 301 or result.status == 302 and + request.httpmethod == HTTP_POST): + result.redirect = newRequest(url.get, HTTP_GET, + mode = request.mode, credentialsMode = request.credentialsMode, + destination = request.destination) + else: + result.redirect = newRequest(url.get, request.httpmethod, + body = request.body, multipart = request.multipart, + mode = request.mode, credentialsMode = request.credentialsMode, + destination = request.destination) # Only a stream of the response body may arrive after this point. result.body = stream if not blocking: |