aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2014-05-19 16:15:37 +0200
committerMartin Willi <martin@revosec.ch>2014-06-04 16:34:15 +0200
commit2e0816e1df4b70ac6fe81cc79d610d85ebfe9a34 (patch)
treec4f982a7cda7a45d053308390ebae37c2f03c5a1
parent6f90fc806104328ec62bfa93893c2c79d5bda5eb (diff)
downloadstrongswan-2e0816e1df4b70ac6fe81cc79d610d85ebfe9a34.tar.bz2
strongswan-2e0816e1df4b70ac6fe81cc79d610d85ebfe9a34.tar.xz
winhttp: Support new response code fetcher option
-rw-r--r--src/libstrongswan/plugins/winhttp/winhttp_fetcher.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/libstrongswan/plugins/winhttp/winhttp_fetcher.c b/src/libstrongswan/plugins/winhttp/winhttp_fetcher.c
index 600fa9658..9119e1d0a 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: