]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
winhttp: Support new response code fetcher option
authorMartin Willi <martin@revosec.ch>
Mon, 19 May 2014 14:15:37 +0000 (16:15 +0200)
committerMartin Willi <martin@revosec.ch>
Wed, 4 Jun 2014 14:34:15 +0000 (16:34 +0200)
src/libstrongswan/plugins/winhttp/winhttp_fetcher.c

index 600fa96588995b98d2c69b74f2b98ebdf5d4a8a9..9119e1d0a9548325269210c2ad8e5cf43f0b6a20 100644 (file)
@@ -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: