/** * Parses the hsts directives from given header like specified in RFC 6797 6.1 */ static void parse_hsts_header(HSTSProvider *provider, const char *host, const char *header) { GHashTable *directives = soup_header_parse_semi_param_list(header); HSTSEntry *entry; int max_age = G_MAXINT; gboolean include_sub_domains = false; GHashTableIter iter; gpointer key, value; gboolean success = true; HSTSProviderClass *klass = g_type_class_ref(HSTS_TYPE_PROVIDER); g_hash_table_iter_init(&iter, directives); while (g_hash_table_iter_next(&iter, &key, &value)) { /* parse the max-age directive */ if (!g_ascii_strncasecmp(key, "max-age", 7)) { /* max age needs a value */ if (value) { max_age = g_ascii_strtoll(value, NULL, 10); if (max_age < 0) { success = false; break; } } else { success = false; break; } } else if (g_ascii_strncasecmp(key, "includeSubDomains", 17)) { /* includeSubDomains must not have a value */ if (!value) { include_sub_domains = true; } else { success = false; break; } } } soup_header_free_param_list(directives); g_type_class_unref(klass); if (success) { /* remove host if max-age = 0 RFC 6797 6.1.1 */ if (max_age == 0) { remove_host_entry(provider, host); } else { entry = g_slice_new(HSTSEntry); entry->expires_at = soup_date_new_from_now(max_age); entry->include_sub_domains = include_sub_domains; add_host_entry(provider, host, entry); add_host_entry_to_file(provider, host, entry); } } }
static gboolean parse_content_foo (SoupMessageHeaders *hdrs, const char *header_name, char **foo, GHashTable **params) { const char *header; char *semi; header = soup_message_headers_get_one (hdrs, header_name); if (!header) return FALSE; if (foo) { *foo = g_strdup (header); semi = strchr (*foo, ';'); if (semi) { char *p = semi; *semi++ = '\0'; while (p - 1 > *foo && g_ascii_isspace(p[-1])) *(--p) = '\0'; } } else { semi = strchr (header, ';'); if (semi) semi++; } if (!params) return TRUE; if (!semi) { *params = soup_header_parse_semi_param_list (""); return TRUE; } *params = soup_header_parse_semi_param_list (semi); return TRUE; }