static guint xp_object_get_status (xmlXPathObjectPtr result) { gboolean res; guint ret = 0; if (result == NULL) return ret; if (result->type == XPATH_STRING) { res = soup_headers_parse_status_line ((gchar *) result->stringval, NULL, &ret, NULL); if (!res) { ret = 0; } } xmlXPathFreeObject (result); return ret; }
/** * soup_headers_parse_response: * @str: the headers (up to, but not including, the trailing blank line) * @len: length of @str * @headers: #SoupMessageHeaders to store the header values in * @ver: (out) (allow-none): if non-%NULL, will be filled in with the HTTP * version * @status_code: (out) (allow-none): if non-%NULL, will be filled in with * the status code * @reason_phrase: (out) (allow-none): if non-%NULL, will be filled in with * the reason phrase * * Parses the headers of an HTTP response in @str and stores the * results in @ver, @status_code, @reason_phrase, and @headers. * * Beware that @headers may be modified even on failure. * * Return value: success or failure. **/ gboolean soup_headers_parse_response (const char *str, int len, SoupMessageHeaders *headers, SoupHTTPVersion *ver, guint *status_code, char **reason_phrase) { SoupHTTPVersion version; g_return_val_if_fail (str != NULL, FALSE); /* Workaround for broken servers that send extra line breaks * after a response, which we then see prepended to the next * response on that connection. */ while ((*str == '\r' || *str == '\n') && len > 0) { str++; len--; } if (!len) return FALSE; if (!soup_headers_parse (str, len, headers)) return FALSE; if (!soup_headers_parse_status_line (str, &version, status_code, reason_phrase)) return FALSE; if (ver) *ver = version; /* RFC 2616 14.10 */ if (version == SOUP_HTTP_1_0) soup_message_headers_clean_connection_headers (headers); return TRUE; }