00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "libts.h"
00034 #include "Error.h"
00035 #include "LogAccessHttp.h"
00036 #include "http/HttpSM.h"
00037 #include "MIME.h"
00038 #include "HTTP.h"
00039 #include "LogUtils.h"
00040 #include "LogObject.h"
00041 #include "LogConfig.h"
00042 #include "Log.h"
00043
00044
00045
00046
00047
00048
00049
00050
00051 LogAccessHttp::LogAccessHttp(HttpSM * sm)
00052 : m_http_sm(sm), m_arena(), m_client_request(NULL), m_proxy_response(NULL), m_proxy_request(NULL),
00053 m_server_response(NULL), m_cache_response(NULL), m_client_req_url_str(NULL), m_client_req_url_len(0),
00054 m_client_req_url_canon_str(NULL), m_client_req_url_canon_len(0), m_client_req_unmapped_url_canon_str(NULL),
00055 m_client_req_unmapped_url_canon_len(-1), m_client_req_unmapped_url_path_str(NULL),
00056 m_client_req_unmapped_url_path_len(-1), m_client_req_unmapped_url_host_str(NULL),
00057 m_client_req_unmapped_url_host_len(-1), m_client_req_url_path_str(NULL), m_client_req_url_path_len(0),
00058 m_proxy_resp_content_type_str(NULL), m_proxy_resp_content_type_len(0)
00059 {
00060 ink_assert(m_http_sm != NULL);
00061 }
00062
00063
00064
00065
00066
00067
00068
00069 LogAccessHttp::~LogAccessHttp()
00070 {
00071 }
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084 #define HIDDEN_CONTENT_TYPE "@Content-Type"
00085 #define HIDDEN_CONTENT_TYPE_LEN 13
00086
00087 void
00088 LogAccessHttp::init()
00089 {
00090 HttpTransact::HeaderInfo * hdr = &(m_http_sm->t_state.hdr_info);
00091
00092 if (hdr->client_request.valid()) {
00093 m_client_request = &(hdr->client_request);
00094
00095
00096 const char *url_string_ref = m_client_request->url_string_get_ref(&m_client_req_url_len);
00097 m_client_req_url_str = m_arena.str_alloc(m_client_req_url_len + 1);
00098 memcpy(m_client_req_url_str, url_string_ref, m_client_req_url_len);
00099 m_client_req_url_str[m_client_req_url_len] = '\0';
00100
00101 m_client_req_url_canon_str = LogUtils::escapify_url(&m_arena, m_client_req_url_str, m_client_req_url_len,
00102 &m_client_req_url_canon_len);
00103 m_client_req_url_path_str = m_client_request->path_get(&m_client_req_url_path_len);
00104 }
00105
00106 if (hdr->client_response.valid()) {
00107 m_proxy_response = &(hdr->client_response);
00108 MIMEField *field = m_proxy_response->field_find(MIME_FIELD_CONTENT_TYPE, MIME_LEN_CONTENT_TYPE);
00109 if (field) {
00110 m_proxy_resp_content_type_str = (char *) field->value_get(&m_proxy_resp_content_type_len);
00111
00112
00113
00114
00115 LogUtils::remove_content_type_attributes(m_proxy_resp_content_type_str, &m_proxy_resp_content_type_len);
00116 } else {
00117
00118 field = m_proxy_response->field_find(HIDDEN_CONTENT_TYPE, HIDDEN_CONTENT_TYPE_LEN);
00119 if (field) {
00120 m_proxy_resp_content_type_str = (char *) field->value_get(&m_proxy_resp_content_type_len);
00121 LogUtils::remove_content_type_attributes(m_proxy_resp_content_type_str, &m_proxy_resp_content_type_len);
00122 }
00123 }
00124 }
00125 if (hdr->server_request.valid()) {
00126 m_proxy_request = &(hdr->server_request);
00127 }
00128 if (hdr->server_response.valid()) {
00129 m_server_response = &(hdr->server_response);
00130 }
00131 if (hdr->cache_response.valid()) {
00132 m_cache_response = &(hdr->cache_response);
00133 }
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143 void
00144 LogAccessHttp::set_client_req_url(char *buf, int len)
00145 {
00146 if (buf) {
00147 m_client_req_url_len = len;
00148 ink_strlcpy(m_client_req_url_str, buf, m_client_req_url_len + 1);
00149 }
00150 }
00151
00152 void
00153 LogAccessHttp::set_client_req_url_canon(char *buf, int len)
00154 {
00155 if (buf) {
00156 m_client_req_url_canon_len = len;
00157 ink_strlcpy(m_client_req_url_canon_str, buf, m_client_req_url_canon_len + 1);
00158 }
00159 }
00160
00161 void
00162 LogAccessHttp::set_client_req_unmapped_url_canon(char *buf, int len)
00163 {
00164 if (buf) {
00165 m_client_req_unmapped_url_canon_len = len;
00166 ink_strlcpy(m_client_req_unmapped_url_canon_str, buf, m_client_req_unmapped_url_canon_len + 1);
00167 }
00168 }
00169
00170 void
00171 LogAccessHttp::set_client_req_unmapped_url_path(char *buf, int len)
00172 {
00173 if (buf) {
00174 m_client_req_unmapped_url_path_len = len;
00175 ink_strlcpy(m_client_req_unmapped_url_path_str, buf, m_client_req_unmapped_url_path_len + 1);
00176 }
00177 }
00178
00179 void
00180 LogAccessHttp::set_client_req_unmapped_url_host(char *buf, int len)
00181 {
00182 if (buf) {
00183 m_client_req_unmapped_url_host_len = len;
00184 ink_strlcpy(m_client_req_unmapped_url_host_str, buf, m_client_req_unmapped_url_host_len + 1);
00185 }
00186 }
00187
00188 void
00189 LogAccessHttp::set_client_req_url_path(char *buf, int len)
00190 {
00191
00192 if (buf) {
00193 m_client_req_url_path_len = len;
00194 ink_strlcpy(m_client_req_unmapped_url_path_str, buf, m_client_req_url_path_len + 1);
00195 }
00196 }
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 int
00210 LogAccessHttp::marshal_plugin_identity_id(char *buf)
00211 {
00212 if (buf) marshal_int(buf, m_http_sm->plugin_id);
00213 return INK_MIN_ALIGN;
00214 }
00215
00216 int
00217 LogAccessHttp::marshal_plugin_identity_tag(char *buf)
00218 {
00219 int len = INK_MIN_ALIGN;
00220 char const* tag = m_http_sm->plugin_tag;
00221
00222 if (!tag) tag = "*";
00223 else len = LogAccess::strlen(tag);
00224
00225 if (buf) marshal_str(buf, tag, len);
00226
00227 return len;
00228 }
00229
00230 int
00231 LogAccessHttp::marshal_client_host_ip(char *buf)
00232 {
00233 return marshal_ip(buf, &m_http_sm->t_state.client_info.addr.sa);
00234 }
00235
00236
00237
00238
00239 int
00240 LogAccessHttp::marshal_client_host_port(char *buf)
00241 {
00242 if (buf) {
00243 uint16_t port = ntohs(m_http_sm->t_state.client_info.addr.port());
00244 marshal_int(buf, port);
00245 }
00246 return INK_MIN_ALIGN;
00247 }
00248
00249
00250
00251
00252
00253 int
00254 LogAccessHttp::marshal_client_auth_user_name(char *buf)
00255 {
00256 char *str = NULL;
00257 int len = INK_MIN_ALIGN;
00258
00259
00260
00261
00262
00263
00264
00265
00266 if (buf) {
00267 marshal_str(buf, str, len);
00268 }
00269 return len;
00270 }
00271
00272
00273
00274
00275
00276
00277
00278 void
00279 LogAccessHttp::validate_unmapped_url(void)
00280 {
00281 if (m_client_req_unmapped_url_canon_len < 0) {
00282 if (m_http_sm->t_state.pristine_url.valid()) {
00283 int unmapped_url_len;
00284 char *unmapped_url = m_http_sm->t_state.pristine_url.string_get_ref(&unmapped_url_len);
00285
00286 if (unmapped_url && unmapped_url[0] != 0) {
00287 m_client_req_unmapped_url_canon_str =
00288 LogUtils::escapify_url(&m_arena, unmapped_url, unmapped_url_len, &m_client_req_unmapped_url_canon_len);
00289 }
00290 } else {
00291 m_client_req_unmapped_url_canon_len = 0;
00292 }
00293 }
00294 }
00295
00296
00297
00298
00299
00300
00301 void
00302 LogAccessHttp::validate_unmapped_url_path(void)
00303 {
00304 int len;
00305 char *c;
00306
00307 if (m_client_req_unmapped_url_path_len < 0 && m_client_req_unmapped_url_host_len < 0) {
00308
00309 m_client_req_unmapped_url_path_str = m_client_req_unmapped_url_canon_str;
00310 m_client_req_unmapped_url_path_len = m_client_req_unmapped_url_canon_len;
00311
00312 if (m_client_req_unmapped_url_path_len >= 6) {
00313 c = (char *) memchr((void *) m_client_req_unmapped_url_path_str, ':', m_client_req_unmapped_url_path_len - 1);
00314 if (c && (len = (int) (c - m_client_req_unmapped_url_path_str)) <= 5) {
00315 if (len + 2 <= m_client_req_unmapped_url_canon_len && c[1] == '/' && c[2] == '/') {
00316 len += 3;
00317 m_client_req_unmapped_url_host_str = &m_client_req_unmapped_url_canon_str[len];
00318 m_client_req_unmapped_url_host_len = m_client_req_unmapped_url_path_len - len;
00319
00320 if (m_client_req_unmapped_url_host_len > 0 &&
00321 (c =
00322 (char *) memchr((void *) m_client_req_unmapped_url_host_str, '/',
00323 m_client_req_unmapped_url_path_len)) != 0) {
00324 m_client_req_unmapped_url_host_len = (int) (c - m_client_req_unmapped_url_host_str);
00325 m_client_req_unmapped_url_path_str = &m_client_req_unmapped_url_host_str[m_client_req_unmapped_url_host_len];
00326 m_client_req_unmapped_url_path_len = m_client_req_unmapped_url_path_len - len - m_client_req_unmapped_url_host_len;
00327 }
00328 }
00329 }
00330 }
00331 }
00332 }
00333
00334
00335
00336
00337
00338
00339
00340 int
00341 LogAccessHttp::marshal_client_req_text(char *buf)
00342 {
00343 int len = marshal_client_req_http_method(NULL) + marshal_client_req_url(NULL) + marshal_client_req_http_version(NULL);
00344
00345 if (buf) {
00346 int offset = 0;
00347 offset += marshal_client_req_http_method(&buf[offset]);
00348 offset += marshal_client_req_url(&buf[offset]);
00349 offset += marshal_client_req_http_version(&buf[offset]);
00350 len = offset;
00351 }
00352 return len;
00353 }
00354
00355
00356
00357
00358 int
00359 LogAccessHttp::marshal_client_req_http_method(char *buf)
00360 {
00361 char *str = NULL;
00362 int alen = 0;
00363 int plen = INK_MIN_ALIGN;
00364
00365 if (m_client_request) {
00366 str = (char *) m_client_request->method_get(&alen);
00367
00368
00369
00370
00371
00372
00373 if (alen) {
00374 plen = round_strlen(alen + 1);
00375 }
00376 }
00377
00378 if (buf)
00379 marshal_mem(buf, str, alen, plen);
00380 return plen;
00381 }
00382
00383
00384
00385
00386 int
00387 LogAccessHttp::marshal_client_req_url(char *buf)
00388 {
00389 int len = round_strlen(m_client_req_url_len + 1);
00390
00391 if (buf) {
00392 marshal_mem(buf, m_client_req_url_str, m_client_req_url_len, len);
00393 }
00394 return len;
00395 }
00396
00397
00398
00399
00400 int
00401 LogAccessHttp::marshal_client_req_url_canon(char *buf)
00402 {
00403 int len = round_strlen(m_client_req_url_canon_len + 1);
00404
00405 if (buf) {
00406 marshal_mem(buf, m_client_req_url_canon_str, m_client_req_url_canon_len, len);
00407 }
00408 return len;
00409 }
00410
00411
00412
00413
00414
00415 int
00416 LogAccessHttp::marshal_client_req_unmapped_url_canon(char *buf)
00417 {
00418 int len = INK_MIN_ALIGN;
00419
00420 validate_unmapped_url();
00421 if (0 == m_client_req_unmapped_url_canon_len) {
00422
00423
00424
00425 len = marshal_client_req_url_canon(buf);
00426 } else {
00427 len = round_strlen(m_client_req_unmapped_url_canon_len + 1);
00428 if (buf) {
00429 marshal_mem(buf, m_client_req_unmapped_url_canon_str, m_client_req_unmapped_url_canon_len, len);
00430 }
00431 }
00432
00433 return len;
00434 }
00435
00436
00437
00438
00439 int
00440 LogAccessHttp::marshal_client_req_unmapped_url_path(char *buf)
00441 {
00442 int len = INK_MIN_ALIGN;
00443
00444 validate_unmapped_url();
00445 validate_unmapped_url_path();
00446
00447 if (0 == m_client_req_unmapped_url_path_len) {
00448 len = marshal_client_req_url_path(buf);
00449 } else {
00450 len = round_strlen(m_client_req_unmapped_url_path_len + 1);
00451 if (buf) {
00452 marshal_mem(buf, m_client_req_unmapped_url_path_str, m_client_req_unmapped_url_path_len, len);
00453 }
00454 }
00455 return len;
00456 }
00457
00458
00459
00460
00461 int
00462 LogAccessHttp::marshal_client_req_unmapped_url_host(char *buf)
00463 {
00464 int len = INK_MIN_ALIGN;
00465
00466 validate_unmapped_url();
00467 validate_unmapped_url_path();
00468
00469 len = round_strlen(m_client_req_unmapped_url_host_len + 1);
00470 if (buf) {
00471 marshal_mem(buf, m_client_req_unmapped_url_host_str, m_client_req_unmapped_url_host_len, len);
00472 }
00473 return len;
00474 }
00475
00476 int
00477 LogAccessHttp::marshal_client_req_url_path(char *buf)
00478 {
00479 int len = round_strlen(m_client_req_url_path_len + 1);
00480 if (buf) {
00481 marshal_mem(buf, m_client_req_url_path_str, m_client_req_url_path_len, len);
00482 }
00483 return len;
00484 }
00485
00486 int
00487 LogAccessHttp::marshal_client_req_url_scheme(char *buf)
00488 {
00489 char *str = NULL;
00490 int alen = 0;
00491 int plen = INK_MIN_ALIGN;
00492
00493 str = (char *) m_client_request->scheme_get(&alen);
00494
00495
00496
00497
00498
00499
00500 if (alen) {
00501 plen = round_strlen(alen + 1);
00502 }
00503
00504 if (buf) {
00505 marshal_mem(buf, str, alen, plen);
00506 }
00507
00508 return plen;
00509 }
00510
00511
00512
00513
00514
00515
00516 int
00517 LogAccessHttp::marshal_client_req_http_version(char *buf)
00518 {
00519 if (buf) {
00520 int64_t major = 0;
00521 int64_t minor = 0;
00522 if (m_client_request) {
00523 HTTPVersion versionObject = m_client_request->version_get();
00524 major = HTTP_MAJOR(versionObject.m_version);
00525 minor = HTTP_MINOR(versionObject.m_version);
00526 }
00527 marshal_int(buf, major);
00528 marshal_int((buf + INK_MIN_ALIGN), minor);
00529 }
00530 return (2 * INK_MIN_ALIGN);
00531 }
00532
00533
00534
00535
00536 int
00537 LogAccessHttp::marshal_client_req_header_len(char *buf)
00538 {
00539 if (buf) {
00540 int64_t len = 0;
00541 if (m_client_request) {
00542 len = m_client_request->length_get();
00543 }
00544 marshal_int(buf, len);
00545 }
00546 return INK_MIN_ALIGN;
00547 }
00548
00549
00550
00551
00552 int
00553 LogAccessHttp::marshal_client_req_body_len(char *buf)
00554 {
00555 if (buf) {
00556 int64_t len = 0;
00557 if (m_client_request) {
00558 len = m_http_sm->client_request_body_bytes;
00559 }
00560 marshal_int(buf, len);
00561 }
00562 return INK_MIN_ALIGN;
00563 }
00564
00565 int
00566 LogAccessHttp::marshal_client_finish_status_code(char *buf)
00567 {
00568 if (buf) {
00569 int code = LOG_FINISH_FIN;
00570 HttpTransact::AbortState_t cl_abort_state = m_http_sm->t_state.client_info.abort;
00571 if (cl_abort_state == HttpTransact::ABORTED) {
00572
00573
00574 if (m_http_sm->t_state.client_info.state == HttpTransact::ACTIVE_TIMEOUT ||
00575 m_http_sm->t_state.client_info.state == HttpTransact::INACTIVE_TIMEOUT) {
00576 code = LOG_FINISH_TIMEOUT;
00577 } else {
00578 code = LOG_FINISH_INTR;
00579 }
00580 }
00581 marshal_int(buf, code);
00582 }
00583 return INK_MIN_ALIGN;
00584 }
00585
00586
00587
00588
00589 int
00590 LogAccessHttp::marshal_proxy_resp_content_type(char *buf)
00591 {
00592 int len = round_strlen(m_proxy_resp_content_type_len + 1);
00593 if (buf) {
00594 marshal_mem(buf, m_proxy_resp_content_type_str, m_proxy_resp_content_type_len, len);
00595 }
00596 return len;
00597 }
00598
00599
00600
00601
00602
00603 int
00604 LogAccessHttp::marshal_proxy_resp_squid_len(char *buf)
00605 {
00606 if (buf) {
00607 int64_t val = m_http_sm->client_response_hdr_bytes + m_http_sm->client_response_body_bytes;
00608 marshal_int(buf, val);
00609 }
00610 return INK_MIN_ALIGN;
00611 }
00612
00613
00614
00615
00616 int
00617 LogAccessHttp::marshal_proxy_resp_content_len(char *buf)
00618 {
00619 if (buf) {
00620 int64_t val = m_http_sm->client_response_body_bytes;
00621 marshal_int(buf, val);
00622 }
00623 return INK_MIN_ALIGN;
00624 }
00625
00626
00627
00628
00629 int
00630 LogAccessHttp::marshal_proxy_resp_status_code(char *buf)
00631 {
00632 if (buf) {
00633 HTTPStatus status;
00634 if (m_proxy_response && m_client_request) {
00635 if (m_client_request->version_get() >= HTTPVersion(1, 0)) {
00636 status = m_proxy_response->status_get();
00637 }
00638
00639
00640
00641 else if (m_proxy_response->valid()) {
00642 status = m_proxy_response->status_get();
00643 } else {
00644 status = HTTP_STATUS_OK;
00645 }
00646 } else {
00647 status = HTTP_STATUS_NONE;
00648 }
00649 marshal_int(buf, (int64_t) status);
00650 }
00651 return INK_MIN_ALIGN;
00652 }
00653
00654
00655
00656
00657 int
00658 LogAccessHttp::marshal_proxy_resp_header_len(char *buf)
00659 {
00660 if (buf) {
00661 int64_t val = m_http_sm->client_response_hdr_bytes;
00662 marshal_int(buf, val);
00663 }
00664 return INK_MIN_ALIGN;
00665 }
00666
00667 int
00668 LogAccessHttp::marshal_proxy_finish_status_code(char *buf)
00669 {
00670
00671
00672
00673 if (buf) {
00674 int code = LOG_FINISH_FIN;
00675 if (m_http_sm->t_state.current.server) {
00676 switch (m_http_sm->t_state.current.server->state) {
00677 case HttpTransact::ACTIVE_TIMEOUT:
00678 case HttpTransact::INACTIVE_TIMEOUT:
00679 code = LOG_FINISH_TIMEOUT;
00680 break;
00681 case HttpTransact::CONNECTION_ERROR:
00682 code = LOG_FINISH_INTR;
00683 break;
00684 default:
00685 if (m_http_sm->t_state.current.server->abort == HttpTransact::ABORTED) {
00686 code = LOG_FINISH_INTR;
00687 }
00688 break;
00689 }
00690 }
00691
00692 marshal_int(buf, code);
00693 }
00694
00695 return INK_MIN_ALIGN;
00696 }
00697
00698
00699
00700
00701 int
00702 LogAccessHttp::marshal_cache_result_code(char *buf)
00703 {
00704 if (buf) {
00705 SquidLogCode code = m_http_sm->t_state.squid_codes.log_code;
00706 marshal_int(buf, (int64_t) code);
00707 }
00708 return INK_MIN_ALIGN;
00709 }
00710
00711
00712
00713
00714 int
00715 LogAccessHttp::marshal_proxy_req_header_len(char *buf)
00716 {
00717 if (buf) {
00718 int64_t val = 0;
00719 if (m_proxy_request) {
00720 val = m_proxy_request->length_get();
00721 }
00722 marshal_int(buf, val);
00723 }
00724 return INK_MIN_ALIGN;
00725 }
00726
00727
00728
00729
00730 int
00731 LogAccessHttp::marshal_proxy_req_body_len(char *buf)
00732 {
00733 if (buf) {
00734 int64_t val = 0;
00735 if (m_proxy_request) {
00736 val = m_http_sm->server_request_body_bytes;
00737 }
00738 marshal_int(buf, val);
00739 }
00740 return INK_MIN_ALIGN;
00741 }
00742
00743 int
00744 LogAccessHttp::marshal_proxy_req_server_name(char *buf)
00745 {
00746 char *str = NULL;
00747 int len = INK_MIN_ALIGN;
00748
00749 if (m_http_sm->t_state.current.server) {
00750 str = m_http_sm->t_state.current.server->name;
00751 len = LogAccess::strlen(str);
00752 }
00753
00754 if (buf) {
00755 marshal_str(buf, str, len);
00756 }
00757 return len;
00758 }
00759
00760
00761 int
00762 LogAccessHttp::marshal_proxy_req_server_ip(char *buf)
00763 {
00764 return marshal_ip(buf, m_http_sm->t_state.current.server != NULL ? &m_http_sm->t_state.current.server->addr.sa : 0);
00765 }
00766
00767
00768
00769
00770 int
00771 LogAccessHttp::marshal_proxy_hierarchy_route(char *buf)
00772 {
00773 if (buf) {
00774 SquidHierarchyCode code = m_http_sm->t_state.squid_codes.hier_code;
00775 marshal_int(buf, (int64_t) code);
00776 }
00777 return INK_MIN_ALIGN;
00778 }
00779
00780
00781
00782
00783
00784 int
00785 LogAccessHttp::marshal_server_host_ip(char *buf)
00786 {
00787 sockaddr const* ip = 0;
00788 ip = &m_http_sm->t_state.server_info.addr.sa;
00789 if (! ats_is_ip(ip)) {
00790 if (m_http_sm->t_state.current.server) {
00791 ip = &m_http_sm->t_state.current.server->addr.sa;
00792 if (! ats_is_ip(ip)) ip = 0;
00793 } else {
00794 ip = 0;
00795 }
00796 }
00797 return marshal_ip(buf, ip);
00798 }
00799
00800
00801
00802
00803
00804 int
00805 LogAccessHttp::marshal_server_host_name(char *buf)
00806 {
00807 char const* str = NULL;
00808 int padded_len = INK_MIN_ALIGN;
00809 int actual_len = 0;
00810
00811 if (m_client_request) {
00812 str = m_client_request->host_get(&actual_len);
00813
00814 if (str)
00815 padded_len = round_strlen(actual_len + 1);
00816 }
00817 if (buf) {
00818 marshal_mem(buf, str, actual_len, padded_len);
00819 }
00820 return padded_len;
00821 }
00822
00823
00824
00825
00826
00827 int
00828 LogAccessHttp::marshal_server_resp_status_code(char *buf)
00829 {
00830 if (buf) {
00831 HTTPStatus status;
00832 if (m_server_response) {
00833 status = m_server_response->status_get();
00834 } else {
00835 status = HTTP_STATUS_NONE;
00836 }
00837 marshal_int(buf, (int64_t) status);
00838 }
00839 return INK_MIN_ALIGN;
00840 }
00841
00842
00843
00844
00845 int
00846 LogAccessHttp::marshal_server_resp_content_len(char *buf)
00847 {
00848 if (buf) {
00849 int64_t val = 0;
00850 if (m_server_response) {
00851 val = m_http_sm->server_response_body_bytes;
00852 }
00853 marshal_int(buf, val);
00854 }
00855 return INK_MIN_ALIGN;
00856 }
00857
00858
00859
00860
00861 int
00862 LogAccessHttp::marshal_server_resp_header_len(char *buf)
00863 {
00864 if (buf) {
00865 int64_t val = 0;
00866 if (m_server_response) {
00867 val = m_server_response->length_get();
00868 }
00869 marshal_int(buf, val);
00870 }
00871 return INK_MIN_ALIGN;
00872 }
00873
00874 int
00875 LogAccessHttp::marshal_server_resp_http_version(char *buf)
00876 {
00877 if (buf) {
00878 int64_t major = 0;
00879 int64_t minor = 0;
00880 if (m_server_response) {
00881 major = HTTP_MAJOR(m_server_response->version_get().m_version);
00882 minor = HTTP_MINOR(m_server_response->version_get().m_version);
00883 }
00884 marshal_int(buf, major);
00885 marshal_int((buf + INK_MIN_ALIGN), minor);
00886 }
00887 return (2 * INK_MIN_ALIGN);
00888 }
00889
00890
00891
00892
00893 int
00894 LogAccessHttp::marshal_cache_resp_status_code(char *buf)
00895 {
00896 if (buf) {
00897 HTTPStatus status;
00898 if (m_cache_response) {
00899 status = m_cache_response->status_get();
00900 } else {
00901 status = HTTP_STATUS_NONE;
00902 }
00903 marshal_int(buf, (int64_t) status);
00904 }
00905 return INK_MIN_ALIGN;
00906 }
00907
00908
00909
00910
00911 int
00912 LogAccessHttp::marshal_cache_resp_content_len(char *buf)
00913 {
00914 if (buf) {
00915 int64_t val = 0;
00916 if (m_cache_response) {
00917 val = m_http_sm->cache_response_body_bytes;
00918 }
00919 marshal_int(buf, val);
00920 }
00921 return INK_MIN_ALIGN;
00922 }
00923
00924
00925
00926
00927 int
00928 LogAccessHttp::marshal_cache_resp_header_len(char *buf)
00929 {
00930 if (buf) {
00931 int64_t val = 0;
00932 if (m_cache_response) {
00933 val = m_http_sm->cache_response_hdr_bytes;
00934 }
00935 marshal_int(buf, val);
00936 }
00937 return INK_MIN_ALIGN;
00938 }
00939
00940 int
00941 LogAccessHttp::marshal_cache_resp_http_version(char *buf)
00942 {
00943 if (buf) {
00944 int64_t major = 0;
00945 int64_t minor = 0;
00946 if (m_cache_response) {
00947 major = HTTP_MAJOR(m_cache_response->version_get().m_version);
00948 minor = HTTP_MINOR(m_cache_response->version_get().m_version);
00949 }
00950 marshal_int(buf, major);
00951 marshal_int((buf + INK_MIN_ALIGN), minor);
00952 }
00953 return (2 * INK_MIN_ALIGN);
00954 }
00955
00956
00957 int
00958 LogAccessHttp::marshal_client_retry_after_time(char *buf)
00959 {
00960 if (buf) {
00961 int64_t crat = m_http_sm->t_state.congestion_control_crat;
00962 marshal_int(buf, crat);
00963 }
00964 return INK_MIN_ALIGN;
00965 }
00966
00967 static LogCacheWriteCodeType
00968 convert_cache_write_code(HttpTransact::CacheWriteStatus_t t)
00969 {
00970
00971 LogCacheWriteCodeType code;
00972 switch (t) {
00973 case HttpTransact::NO_CACHE_WRITE:
00974 code = LOG_CACHE_WRITE_NONE;
00975 break;
00976 case HttpTransact::CACHE_WRITE_LOCK_MISS:
00977 code = LOG_CACHE_WRITE_LOCK_MISSED;
00978 break;
00979 case HttpTransact::CACHE_WRITE_IN_PROGRESS:
00980
00981
00982
00983
00984 code = LOG_CACHE_WRITE_LOCK_ABORTED;
00985 break;
00986 case HttpTransact::CACHE_WRITE_ERROR:
00987 code = LOG_CACHE_WRITE_ERROR;
00988 break;
00989 case HttpTransact::CACHE_WRITE_COMPLETE:
00990 code = LOG_CACHE_WRITE_COMPLETE;
00991 break;
00992 default:
00993 ink_assert(!"bad cache write code");
00994 code = LOG_CACHE_WRITE_NONE;
00995 break;
00996 }
00997
00998 return code;
00999 }
01000
01001
01002 int
01003 LogAccessHttp::marshal_cache_write_code(char *buf)
01004 {
01005
01006 if (buf) {
01007 int code = convert_cache_write_code(m_http_sm->t_state.cache_info.write_status);
01008 marshal_int(buf, code);
01009 }
01010
01011 return INK_MIN_ALIGN;
01012 }
01013
01014 int
01015 LogAccessHttp::marshal_cache_write_transform_code(char *buf)
01016 {
01017
01018 if (buf) {
01019 int code = convert_cache_write_code(m_http_sm->t_state.cache_info.transform_write_status);
01020 marshal_int(buf, code);
01021 }
01022
01023 return INK_MIN_ALIGN;
01024 }
01025
01026
01027
01028
01029
01030 int
01031 LogAccessHttp::marshal_transfer_time_ms(char *buf)
01032 {
01033 if (buf) {
01034 ink_hrtime elapsed = m_http_sm->milestones.sm_finish - m_http_sm->milestones.sm_start;
01035 elapsed /= HRTIME_MSECOND;
01036 int64_t val = (int64_t) elapsed;
01037 marshal_int(buf, val);
01038 }
01039 return INK_MIN_ALIGN;
01040 }
01041
01042 int
01043 LogAccessHttp::marshal_transfer_time_s(char *buf)
01044 {
01045 if (buf) {
01046 ink_hrtime elapsed = m_http_sm->milestones.sm_finish - m_http_sm->milestones.sm_start;
01047 elapsed /= HRTIME_SECOND;
01048 int64_t val = (int64_t) elapsed;
01049 marshal_int(buf, val);
01050 }
01051 return INK_MIN_ALIGN;
01052 }
01053
01054
01055
01056
01057
01058 int
01059 LogAccessHttp::marshal_file_size(char *buf)
01060 {
01061 if (buf) {
01062 MIMEField *fld;
01063 HTTPHdr *hdr = m_server_response ? m_server_response : m_cache_response;
01064
01065 if (hdr && (fld = hdr->field_find(MIME_FIELD_CONTENT_RANGE, MIME_LEN_CONTENT_RANGE))) {
01066 int len;
01067 char *str = (char*)fld->value_get(&len);
01068 char *pos = (char*)memchr(str, '/', len);
01069
01070
01071 if (pos && !memchr(pos+1, '*', len - (pos + 1 - str))) {
01072 marshal_int(buf, ink_atoi64(pos+1, len - (pos + 1 - str)));
01073 }
01074 } else {
01075
01076 if (m_http_sm->server_response_body_bytes > 0)
01077 marshal_int(buf, m_http_sm->server_response_body_bytes);
01078 else if (m_http_sm->cache_response_body_bytes > 0)
01079 marshal_int(buf, m_http_sm->cache_response_body_bytes);
01080 }
01081 }
01082
01083
01084 return INK_MIN_ALIGN;
01085 }
01086
01087
01088
01089
01090 int
01091 LogAccessHttp::marshal_http_header_field(LogField::Container container, char *field, char *buf)
01092 {
01093 char *str = NULL;
01094 int padded_len = INK_MIN_ALIGN;
01095 int actual_len = 0;
01096 bool valid_field = false;
01097 HTTPHdr *header;
01098
01099 switch (container) {
01100 case LogField::CQH:
01101 header = m_client_request;
01102 break;
01103
01104 case LogField::PSH:
01105 header = m_proxy_response;
01106 break;
01107
01108 case LogField::PQH:
01109 header = m_proxy_request;
01110 break;
01111
01112 case LogField::SSH:
01113 header = m_server_response;
01114 break;
01115
01116 case LogField::CSSH:
01117 header = m_cache_response;
01118 break;
01119
01120 default:
01121 header = NULL;
01122 break;
01123 }
01124
01125 if (header) {
01126 MIMEField *fld = header->field_find(field, (int)::strlen(field));
01127 if (fld) {
01128 valid_field = true;
01129
01130
01131
01132
01133 int running_len = 0;
01134 while (fld) {
01135 str = (char *) fld->value_get(&actual_len);
01136 if (buf) {
01137 memcpy(buf, str, actual_len);
01138 buf += actual_len;
01139 }
01140 running_len += actual_len;
01141 fld = fld->m_next_dup;
01142
01143
01144
01145
01146 if (fld != NULL) {
01147 if (buf) {
01148 memcpy(buf, ", ", 2);
01149 buf += 2;
01150 }
01151 running_len += 2;
01152 }
01153 }
01154
01155
01156
01157
01158 if (buf) {
01159 *buf = '\0';
01160 buf++;
01161 }
01162 running_len += 1;
01163 padded_len = round_strlen(running_len);
01164
01165
01166
01167
01168
01169 #ifdef DEBUG
01170 if (buf) {
01171 int pad_len = padded_len - running_len;
01172 for (int i = 0; i < pad_len; i++) {
01173 *buf = '$';
01174 buf++;
01175 }
01176 }
01177 #endif
01178 }
01179 }
01180
01181 if (valid_field == false) {
01182 padded_len = INK_MIN_ALIGN;
01183 if (buf) {
01184 marshal_str(buf, NULL, padded_len);
01185 }
01186 }
01187
01188 return (padded_len);
01189 }
01190
01191 int
01192 LogAccessHttp::marshal_http_header_field_escapify(LogField::Container container, char *field, char *buf)
01193 {
01194 char *str = NULL, *new_str = NULL;
01195 int padded_len = INK_MIN_ALIGN;
01196 int actual_len = 0, new_len = 0;
01197 bool valid_field = false;
01198 HTTPHdr *header;
01199
01200 switch (container) {
01201 case LogField::ECQH:
01202 header = m_client_request;
01203 break;
01204
01205 case LogField::EPSH:
01206 header = m_proxy_response;
01207 break;
01208
01209 case LogField::EPQH:
01210 header = m_proxy_request;
01211 break;
01212
01213 case LogField::ESSH:
01214 header = m_server_response;
01215 break;
01216
01217 case LogField::ECSSH:
01218 header = m_cache_response;
01219 break;
01220
01221 default:
01222 header = NULL;
01223 break;
01224 }
01225
01226 if (header) {
01227 MIMEField *fld = header->field_find(field, (int)::strlen(field));
01228 if (fld) {
01229 valid_field = true;
01230
01231
01232
01233
01234 int running_len = 0;
01235 while (fld) {
01236 str = (char *) fld->value_get(&actual_len);
01237 new_str = LogUtils::escapify_url(&m_arena, str, actual_len, &new_len);
01238 if (buf) {
01239 memcpy(buf, new_str, new_len);
01240 buf += new_len;
01241 }
01242 running_len += new_len;
01243 fld = fld->m_next_dup;
01244
01245
01246
01247
01248 if (fld != NULL) {
01249 if (buf) {
01250 memcpy(buf, ", ", 2);
01251 buf += 2;
01252 }
01253 running_len += 2;
01254 }
01255 }
01256
01257
01258
01259
01260 if (buf) {
01261 *buf = '\0';
01262 buf++;
01263 }
01264 running_len += 1;
01265 padded_len = round_strlen(running_len);
01266
01267
01268
01269
01270
01271 #ifdef DEBUG
01272 if (buf) {
01273 int pad_len = padded_len - running_len;
01274 for (int i = 0; i < pad_len; i++) {
01275 *buf = '$';
01276 buf++;
01277 }
01278 }
01279 #endif
01280 }
01281 }
01282
01283 if (valid_field == false) {
01284 padded_len = INK_MIN_ALIGN;
01285 if (buf) {
01286 marshal_str(buf, NULL, padded_len);
01287 }
01288 }
01289
01290 return (padded_len);
01291 }