This implements handling of HTTP status code 308 ([Permanant Redirect](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/308)) in wininet/winhttp. I added handling at all places I could find, but could only test the one in `dlls/wininet/http.c` with the program where it failed (Marvel Heroes).
I tried to keep the implementation parallel to 307, since they serve a similar purpose (redirect while keeping the request intact).
PS: `case` labels are sometimes in different order, would it be a good idea to sort them in numerical HTTP status order while I'm at it?
-- v2: urlmon: Handle HTTP status code 308 (Permanent Redirect) winhttp: Handle HTTP status code 308 (Permanent Redirect) wininet: Handle HTTP status code 308 (Permanent Redirect)
From: Tobias Gruetzmacher tobias-git@23.gs
--- dlls/wininet/http.c | 10 +++++++--- include/wininet.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index 48bfe35866a..497a582ff89 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -5206,12 +5206,14 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *request, LPCWSTR lpszHeaders, case HTTP_STATUS_MOVED: case HTTP_STATUS_REDIRECT_KEEP_VERB: case HTTP_STATUS_REDIRECT_METHOD: + case HTTP_STATUS_PERMANENT_REDIRECT: new_url = get_redirect_url(request); if(!new_url) break;
if (wcscmp(request->verb, L"GET") && wcscmp(request->verb, L"HEAD") && - request->status_code != HTTP_STATUS_REDIRECT_KEEP_VERB) + request->status_code != HTTP_STATUS_REDIRECT_KEEP_VERB && + request->status_code != HTTP_STATUS_PERMANENT_REDIRECT) { free(request->verb); request->verb = wcsdup(L"GET"); @@ -5401,7 +5403,8 @@ static DWORD HTTP_HttpEndRequestW(http_request_t *request, DWORD dwFlags, DWORD_ case HTTP_STATUS_REDIRECT: case HTTP_STATUS_MOVED: case HTTP_STATUS_REDIRECT_METHOD: - case HTTP_STATUS_REDIRECT_KEEP_VERB: { + case HTTP_STATUS_REDIRECT_KEEP_VERB: + case HTTP_STATUS_PERMANENT_REDIRECT: { WCHAR *new_url;
new_url = get_redirect_url(request); @@ -5409,7 +5412,8 @@ static DWORD HTTP_HttpEndRequestW(http_request_t *request, DWORD dwFlags, DWORD_ break;
if (wcscmp(request->verb, L"GET") && wcscmp(request->verb, L"HEAD") && - request->status_code != HTTP_STATUS_REDIRECT_KEEP_VERB) + request->status_code != HTTP_STATUS_REDIRECT_KEEP_VERB && + request->status_code != HTTP_STATUS_PERMANENT_REDIRECT) { free(request->verb); request->verb = wcsdup(L"GET"); diff --git a/include/wininet.h b/include/wininet.h index 0de2b830812..0537585adf8 100644 --- a/include/wininet.h +++ b/include/wininet.h @@ -1242,6 +1242,7 @@ BOOLAPI GopherGetAttributeW(HINTERNET ,LPCWSTR ,LPCWSTR ,LPBYTE , #define HTTP_STATUS_NOT_MODIFIED 304 #define HTTP_STATUS_USE_PROXY 305 #define HTTP_STATUS_REDIRECT_KEEP_VERB 307 +#define HTTP_STATUS_PERMANENT_REDIRECT 308 #define HTTP_STATUS_BAD_REQUEST 400 #define HTTP_STATUS_DENIED 401 #define HTTP_STATUS_PAYMENT_REQ 402
From: Tobias Gruetzmacher tobias-git@23.gs
--- dlls/winhttp/request.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c index 26022dba3b1..b23b0e8c53d 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -3003,7 +3003,8 @@ static DWORD receive_response( struct request *request ) ret = handle_passport_redirect( request ); goto done; } - if (status == HTTP_STATUS_MOVED || status == HTTP_STATUS_REDIRECT || status == HTTP_STATUS_REDIRECT_KEEP_VERB) + if (status == HTTP_STATUS_MOVED || status == HTTP_STATUS_REDIRECT || + status == HTTP_STATUS_REDIRECT_KEEP_VERB || status == HTTP_STATUS_PERMANENT_REDIRECT) { if (request->hdr.disable_flags & WINHTTP_DISABLE_REDIRECTS || request->hdr.redirect_policy == WINHTTP_OPTION_REDIRECT_POLICY_NEVER) goto done;
From: Tobias Gruetzmacher tobias-git@23.gs
--- dlls/urlmon/http.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/urlmon/http.c b/dlls/urlmon/http.c index a24006ba08c..e592f697485 100644 --- a/dlls/urlmon/http.c +++ b/dlls/urlmon/http.c @@ -495,6 +495,7 @@ static BOOL is_redirect_response(DWORD status_code) case HTTP_STATUS_MOVED: case HTTP_STATUS_REDIRECT_KEEP_VERB: case HTTP_STATUS_REDIRECT_METHOD: + case HTTP_STATUS_PERMANENT_REDIRECT: return TRUE; } return FALSE;
Thanks. You still need to add that exception in winhttp. I'll let Jacek comment on wininet and urlmon ;-)