From: Martin Willi Date: Mon, 19 May 2014 14:15:37 +0000 (+0200) Subject: winhttp: Support new response code fetcher option X-Git-Tag: 5.2.0dr6~21^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2e0816e1df4b70ac6fe81cc79d610d85ebfe9a34;p=thirdparty%2Fstrongswan.git winhttp: Support new response code fetcher option --- diff --git a/src/libstrongswan/plugins/winhttp/winhttp_fetcher.c b/src/libstrongswan/plugins/winhttp/winhttp_fetcher.c index 600fa96588..9119e1d0a9 100644 --- a/src/libstrongswan/plugins/winhttp/winhttp_fetcher.c +++ b/src/libstrongswan/plugins/winhttp/winhttp_fetcher.c @@ -72,6 +72,11 @@ struct private_winhttp_fetcher_t { * Timeout for operations, in ms */ u_long timeout; + + /** + * User pointer to store HTTP status code to + */ + u_int *result; }; /** @@ -115,12 +120,33 @@ static bool read_result(private_winhttp_fetcher_t *this, HINTERNET request, { DWORD received; char buf[1024]; + u_int32_t code; + DWORD codelen = sizeof(code); if (!WinHttpReceiveResponse(request, NULL)) { DBG1(DBG_LIB, "reading HTTP response header failed: %u", GetLastError()); return FALSE; } + if (!WinHttpQueryHeaders(request, + WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, + NULL, &code, &codelen, NULL)) + { + DBG1(DBG_LIB, "reading HTTP status code failed: %u", GetLastError()); + return FALSE; + } + if (this->result) + { + *this->result = code; + } + if (code < 200 || code >= 300) + { /* non-successful HTTP status code */ + if (!this->result) + { + DBG1(DBG_LIB, "HTTP request failed with status %u", code); + } + return FALSE; + } if (this->cb == fetcher_default_callback) { *(chunk_t*)user = chunk_empty; @@ -207,6 +233,11 @@ METHOD(fetcher_t, fetch, status_t, method = L"GET"; } + if (this->result) + { /* zero-initialize for early failures */ + *this->result = 0; + } + if (parse_uri(this, uri, host, countof(host), path, countof(path), &flags, &port)) { @@ -291,6 +322,9 @@ METHOD(fetcher_t, set_option, bool, case FETCH_CALLBACK: this->cb = va_arg(args, fetcher_callback_t); break; + case FETCH_RESPONSE_CODE: + this->result = va_arg(args, u_int*); + break; case FETCH_SOURCEIP: /* not supported, FALL */ default: