void h2o_http2_stream_close(h2o_http2_conn_t *conn, h2o_http2_stream_t *stream) { h2o_http2_conn_unregister_stream(conn, stream); if (stream->_req_body != NULL) h2o_buffer_dispose(&stream->_req_body); if (stream->cache_digests != NULL) h2o_cache_digests_destroy(stream->cache_digests); h2o_dispose_request(&stream->req); if (stream->stream_id == 1 && conn->_http1_req_input != NULL) h2o_buffer_dispose(&conn->_http1_req_input); free(stream); }
static void test_decode(void) { h2o_cache_digests_t *digests = NULL; h2o_cache_digests_load_header(&digests, H2O_STRLIT("AeLA")); ok(digests != NULL); if (digests == NULL) return; ok(digests->fresh.url_only.size == 1); ok(digests->fresh.url_and_etag.size == 0); ok(digests->fresh.url_only.entries[0].capacity_bits == 7); ok(digests->fresh.url_only.entries[0].keys.size == 1); ok(digests->fresh.url_only.entries[0].keys.entries[0] == 0x0b); ok(!digests->fresh.complete); ok(h2o_cache_digests_lookup_by_url(digests, H2O_STRLIT("https://127.0.0.1.xip.io:8081/cache-digests.cgi/hello.js")) == H2O_CACHE_DIGESTS_STATE_FRESH); ok(h2o_cache_digests_lookup_by_url(digests, H2O_STRLIT("https://127.0.0.1.xip.io:8081/notfound.js")) == H2O_CACHE_DIGESTS_STATE_UNKNOWN); h2o_cache_digests_load_header(&digests, H2O_STRLIT("FOO; stale, AcA; validators; complete")); ok(digests->fresh.url_only.size == 1); ok(digests->fresh.url_and_etag.size == 1); ok(digests->fresh.url_and_etag.entries[0].capacity_bits == 7); ok(digests->fresh.url_and_etag.entries[0].keys.size == 0); ok(digests->fresh.complete); ok(h2o_cache_digests_lookup_by_url(digests, H2O_STRLIT("https://127.0.0.1.xip.io:8081/notfound.js")) == H2O_CACHE_DIGESTS_STATE_NOT_CACHED); ok(h2o_cache_digests_lookup_by_url(digests, H2O_STRLIT("https://127.0.0.1.xip.io:8081/cache-digests.cgi/hello.js")) == H2O_CACHE_DIGESTS_STATE_FRESH); h2o_cache_digests_load_header(&digests, H2O_STRLIT("AcA; reset")); ok(digests->fresh.url_only.size == 1); ok(digests->fresh.url_and_etag.size == 0); ok(digests->fresh.url_only.entries[0].capacity_bits == 7); ok(digests->fresh.url_only.entries[0].keys.size == 0); ok(!digests->fresh.complete); h2o_cache_digests_destroy(digests); }
void h2o_cache_digests_load_header(h2o_cache_digests_t **digests, const char *value, size_t len) { h2o_iovec_t iter = h2o_iovec_init(value, len); const char *token; size_t token_len; do { const char *gcs_base64; size_t gcs_base64_len; int reset = 0, validators = 0, complete = 0, skip = 0; h2o_iovec_t token_value; if ((gcs_base64 = h2o_next_token(&iter, ';', &gcs_base64_len, NULL)) == NULL) return; while ((token = h2o_next_token(&iter, ';', &token_len, &token_value)) != NULL && !h2o_memis(token, token_len, H2O_STRLIT(","))) { if (h2o_lcstris(token, token_len, H2O_STRLIT("reset"))) { reset = 1; } else if (h2o_lcstris(token, token_len, H2O_STRLIT("validators"))) { validators = 1; } else if (h2o_lcstris(token, token_len, H2O_STRLIT("complete"))) { complete = 1; } else { skip = 1; } } if (reset && *digests != NULL) { h2o_cache_digests_destroy(*digests); *digests = NULL; } if (skip) { /* not supported for the time being */ } else { load_digest(digests, gcs_base64, gcs_base64_len, validators, complete); } } while (token != NULL); }