static char * soup_auth_domain_basic_challenge (SoupAuthDomain *domain, SoupMessage *msg) { GString *challenge; challenge = g_string_new ("Basic "); soup_header_g_string_append_param (challenge, "realm", soup_auth_domain_get_realm (domain)); return g_string_free (challenge, FALSE); }
static void fillResponseFromMessage(SoupMessage* msg, ResourceResponse* response) { SoupMessageHeadersIter iter; const char* name = 0; const char* value = 0; soup_message_headers_iter_init(&iter, msg->response_headers); while (soup_message_headers_iter_next(&iter, &name, &value)) response->setHTTPHeaderField(name, value); GHashTable* contentTypeParameters = 0; String contentType = soup_message_headers_get_content_type(msg->response_headers, &contentTypeParameters); // When the server sends multiple Content-Type headers, soup will // give us their values concatenated with commas as a separator; // we need to handle this and use only one value. We use the first // value, and add all the parameters, afterwards, if any. Vector<String> contentTypes; contentType.split(',', true, contentTypes); contentType = contentTypes[0]; if (contentTypeParameters) { GString* parametersString = g_string_new(0); GHashTableIter hashTableIter; const char* hashKey; const char* hashValue; g_hash_table_iter_init(&hashTableIter, contentTypeParameters); while (g_hash_table_iter_next(&hashTableIter, reinterpret_cast<void**>(const_cast<char**>(&hashKey)), reinterpret_cast<void**>(const_cast<char**>(&hashValue)))) { // Work-around bug in soup which causes a crash; // See http://bugzilla.gnome.org/show_bug.cgi?id=577728 if (!hashValue) hashValue = ""; g_string_append(parametersString, "; "); soup_header_g_string_append_param(parametersString, hashKey, hashValue); } contentType += String(parametersString->str); g_string_free(parametersString, true); g_hash_table_destroy(contentTypeParameters); } response->setMimeType(extractMIMETypeFromMediaType(contentType)); char* uri = soup_uri_to_string(soup_message_get_uri(msg), false); response->setURL(KURL(KURL(), uri)); g_free(uri); response->setTextEncodingName(extractCharsetFromMediaType(contentType)); response->setExpectedContentLength(soup_message_headers_get_content_length(msg->response_headers)); response->setHTTPStatusCode(msg->status_code); response->setHTTPStatusText(msg->reason_phrase); response->setSuggestedFilename(filenameFromHTTPContentDisposition(response->httpHeaderField("Content-Disposition"))); }
static void set_content_foo (SoupMessageHeaders *hdrs, const char *header_name, const char *foo, GHashTable *params) { GString *str; GHashTableIter iter; gpointer key, value; str = g_string_new (foo); if (params) { g_hash_table_iter_init (&iter, params); while (g_hash_table_iter_next (&iter, &key, &value)) { g_string_append (str, "; "); soup_header_g_string_append_param (str, key, value); } } soup_message_headers_replace (hdrs, header_name, str->str); g_string_free (str, TRUE); }
static char * get_authorization (SoupAuth *auth, SoupMessage *msg) { SoupAuthDigestPrivate *priv = SOUP_AUTH_DIGEST_GET_PRIVATE (auth); char response[33], *token; char *url, *algorithm; GString *out; SoupURI *uri; uri = soup_message_get_uri (msg); g_return_val_if_fail (uri != NULL, NULL); url = soup_uri_to_string (uri, TRUE); soup_auth_digest_compute_response (msg->method, url, priv->hex_a1, priv->qop, priv->nonce, priv->cnonce, priv->nc, response); out = g_string_new ("Digest "); soup_header_g_string_append_param (out, "username", priv->user); g_string_append (out, ", "); soup_header_g_string_append_param (out, "realm", auth->realm); g_string_append (out, ", "); soup_header_g_string_append_param (out, "nonce", priv->nonce); g_string_append (out, ", "); soup_header_g_string_append_param (out, "uri", url); g_string_append (out, ", "); algorithm = soup_auth_digest_get_algorithm (priv->algorithm); g_string_append_printf (out, "algorithm=%s", algorithm); g_free (algorithm); g_string_append (out, ", "); soup_header_g_string_append_param (out, "response", response); if (priv->opaque) { g_string_append (out, ", "); soup_header_g_string_append_param (out, "opaque", priv->opaque); } if (priv->qop) { char *qop = soup_auth_digest_get_qop (priv->qop); g_string_append (out, ", "); soup_header_g_string_append_param (out, "cnonce", priv->cnonce); g_string_append_printf (out, ", nc=%.8x, qop=%s", priv->nc, qop); g_free (qop); } g_free (url); priv->nc++; token = g_string_free (out, FALSE); soup_message_add_header_handler (msg, "got_headers", soup_auth_is_for_proxy (auth) ? "Proxy-Authentication-Info" : "Authentication-Info", G_CALLBACK (authentication_info_cb), auth); return token; }