void ts_http_fetcher_extract(http_fetcher *fch) { TSMLoc cl_loc, te_loc; const char *val; int val_len; int i, n; fch->status_code = TSHttpHdrStatusGet(fch->hdr_bufp, fch->hdr_loc); cl_loc = TSMimeHdrFieldFind(fch->hdr_bufp, fch->hdr_loc, TS_MIME_FIELD_CONTENT_LENGTH, TS_MIME_LEN_CONTENT_LENGTH); if (cl_loc) fch->resp_cl = TSMimeHdrFieldValueInt64Get(fch->hdr_bufp, fch->hdr_loc, cl_loc, -1); else fch->resp_cl = -1; te_loc = TSMimeHdrFieldFind(fch->hdr_bufp, fch->hdr_loc, TS_MIME_FIELD_TRANSFER_ENCODING, TS_MIME_LEN_TRANSFER_ENCODING); if (te_loc) { n = TSMimeHdrFieldValuesCount(fch->hdr_bufp, fch->hdr_loc, te_loc); for (i = 0; i < n; i++) { val = TSMimeHdrFieldValueStringGet(fch->hdr_bufp, fch->hdr_loc, te_loc, i, &val_len); if ((val_len == TS_HTTP_LEN_CHUNKED) && (strncasecmp(val, TS_HTTP_VALUE_CHUNKED, val_len) == 0)) { fch->chunked = 1; break; } } } if (cl_loc) TSHandleMLocRelease(fch->hdr_bufp, fch->hdr_loc, cl_loc); if (te_loc) { if (fch->flags & TS_FLAG_FETCH_FORCE_DECHUNK) TSMimeHdrFieldDestroy(fch->hdr_bufp, fch->hdr_loc, te_loc); TSHandleMLocRelease(fch->hdr_bufp, fch->hdr_loc, te_loc); } if (fch->chunked) { if (fch->flags & TS_FLAG_FETCH_FORCE_DECHUNK) { chunked_info_init(&fch->cinfo, 1); } else { chunked_info_init(&fch->cinfo, 0); } } else if (fch->resp_cl >= 0) { fch->resp_already = 0; } fch->flow_buffer = TSIOBufferCreate(); fch->flow_reader = TSIOBufferReaderAlloc(fch->flow_buffer); fch->body_buffer = TSIOBufferCreate(); fch->body_reader = TSIOBufferReaderAlloc(fch->body_buffer); }
static CachedHeaderInfo * get_cached_header_info(TSHttpTxn txn) { CachedHeaderInfo *chi; TSMBuffer cr_buf; TSMLoc cr_hdr_loc, cr_date_loc, cr_cache_control_loc, cr_cache_control_dup_loc; int cr_cache_control_count, val_len, i; char *value, *ptr; chi = (CachedHeaderInfo *)TSmalloc(sizeof(CachedHeaderInfo)); memset(chi, 0, sizeof(CachedHeaderInfo)); if (TSHttpTxnCachedRespGet(txn, &cr_buf, &cr_hdr_loc) == TS_SUCCESS) { cr_date_loc = TSMimeHdrFieldFind(cr_buf, cr_hdr_loc, TS_MIME_FIELD_DATE, TS_MIME_LEN_DATE); if (cr_date_loc != TS_NULL_MLOC) { TSDebug(PLUGIN_NAME, "Found a date"); chi->date = TSMimeHdrFieldValueDateGet(cr_buf, cr_hdr_loc, cr_date_loc); TSHandleMLocRelease(cr_buf, cr_hdr_loc, cr_date_loc); } cr_cache_control_loc = TSMimeHdrFieldFind(cr_buf, cr_hdr_loc, TS_MIME_FIELD_CACHE_CONTROL, TS_MIME_LEN_CACHE_CONTROL); while (cr_cache_control_loc != TS_NULL_MLOC) { TSDebug(PLUGIN_NAME, "Found cache-control"); cr_cache_control_count = TSMimeHdrFieldValuesCount(cr_buf, cr_hdr_loc, cr_cache_control_loc); for (i = 0; i < cr_cache_control_count; i++) { value = (char *)TSMimeHdrFieldValueStringGet(cr_buf, cr_hdr_loc, cr_cache_control_loc, i, &val_len); ptr = value; if (strncmp(value, TS_HTTP_VALUE_MAX_AGE, TS_HTTP_LEN_MAX_AGE) == 0) { TSDebug(PLUGIN_NAME, "Found max-age"); ptr += TS_HTTP_LEN_MAX_AGE; if (*ptr == '=') { ptr++; chi->max_age = atol(ptr); } else { ptr = TSstrndup(value, TS_HTTP_LEN_MAX_AGE + 2); TSDebug(PLUGIN_NAME, "This is what I found: %s", ptr); TSfree(ptr); } } else if (strncmp(value, HTTP_VALUE_STALE_WHILE_REVALIDATE, strlen(HTTP_VALUE_STALE_WHILE_REVALIDATE)) == 0) { TSDebug(PLUGIN_NAME, "Found stale-while-revalidate"); ptr += strlen(HTTP_VALUE_STALE_WHILE_REVALIDATE); if (*ptr == '=') { ptr++; chi->stale_while_revalidate = atol(ptr); } } else if (strncmp(value, HTTP_VALUE_STALE_IF_ERROR, strlen(HTTP_VALUE_STALE_IF_ERROR)) == 0) { TSDebug(PLUGIN_NAME, "Found stale-on-error"); ptr += strlen(HTTP_VALUE_STALE_IF_ERROR); if (*ptr == '=') { ptr++; chi->stale_on_error = atol(ptr); } } else { TSDebug(PLUGIN_NAME, "Unknown field value"); } } cr_cache_control_dup_loc = TSMimeHdrFieldNextDup(cr_buf, cr_hdr_loc, cr_cache_control_loc); TSHandleMLocRelease(cr_buf, cr_hdr_loc, cr_cache_control_loc); cr_cache_control_loc = cr_cache_control_dup_loc; } TSHandleMLocRelease(cr_buf, TS_NULL_MLOC, cr_hdr_loc); } return chi; }