There are two API: TSHttpTxnClientRespBodyBytesGet and TSHttpTxnClientRespHdrBytesGet (can be invoked in TS_HTTP_TXN_CLOSE_HOOK in my test). I think their returned value are %<pscl> and %<pshl>.
Content-Length is larger than transfered length, because user-agent can easily abort request. On Fri, Aug 17, 2012 at 10:47 AM, Phil Sorber <p...@omniti.com> wrote: > Does your plugin handle chunked encoding? > > On Thu, Aug 16, 2012 at 8:14 PM, Adam Phelps <a...@opendns.com> wrote: > > I'm working on a plugin, one of the functions of which is to accurate > track > > how much data is being sent to a given client, both for totals and a > > per-UserAgent count. > > > > This seems to mostly work, but I'm seeing some major discrepancies > between > > what the plugin is reporting and what is actually being sent out > (measured > > via collectd and iptables) when doing streaming (via youtube). And these > > are major differences, the plugin reports 100GB for an hour of youtube > > streaming, where my other counters should closer to 600MB. The 600MB > number > > seems about right for this sort of content. > > > > The method I'm using to track the totals sent are to set a global hook > for > > TS_HTTP_SEND_RESPONSE_HDR_HOOK and then get and sum up the > > TS_MIME_FIELD_CONTENT_LENGTH header. However with the youtube streaming > > this will see much larger numbers for Content-Length than even what is > > reported in the ATS log (via %<psql> in logs_xml.config). > > > > Here's how I'm getting the content length in the hook attached to > > TS_HTTP_SEND_RESPONSE_HDR_HOOK: > > > > if (TSHttpTxnClientRespGet(txnp, &resp_bufp, &resp_loc) != > > TS_SUCCESS) { > > LOG(LOG_ERROR, > > "Error while retrieving resp header\n"); > > goto OUT; > > } > > > > /* Lookup the Content-Length field */ > > TSMLoc content_len_loc = TSMimeHdrFieldFind(resp_bufp, resp_loc, > > TS_MIME_FIELD_CONTENT_LENGTH, > > TS_MIME_LEN_CONTENT_LENGTH); > > if (!content_len_loc) { > > goto OUT; > > } > > int content_len_val_len; > > const char *content_len_val = > > TSMimeHdrFieldValueStringGet(resp_bufp, resp_loc, > > content_len_loc, 0, > > &content_len_val_len); > > if (!content_len_val) { > > LOG(LOG_ERROR, "Failed to get Content-Length value"); > > goto OUT; > > } > > > > This is clearly not working for streaming, is there a better way to get > the > > total size of the data being returned to the requesting client? > > > > - Adam >