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 #ifndef LOG_ACCESS_H
00030 #define LOG_ACCESS_H
00031 #include "libts.h"
00032 #include "LogField.h"
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 #define DEFAULT_STR "-"
00093 #define DEFAULT_STR_LEN 1
00094
00095 #define DEFAULT_INT_FIELD {\
00096 if (buf) { \
00097 int64_t i = 0; \
00098 marshal_int (buf, i); \
00099 } \
00100 return INK_MIN_ALIGN; \
00101 }
00102
00103 #define DEFAULT_STR_FIELD {\
00104 char * str = NULL; \
00105 int len = INK_MIN_ALIGN; \
00106 if (buf) { \
00107 marshal_str (buf, str, len); \
00108 } \
00109 return len; \
00110 }
00111
00112 #define DEFAULT_IP_FIELD {\
00113 int len = sizeof(LogFieldIp); \
00114 if (buf) { \
00115 len = marshal_ip (buf, NULL); \
00116 } \
00117 return len; \
00118 }
00119
00120
00121
00122
00123
00124
00125 #define MARSHAL_RECORD_LENGTH 32
00126
00127 enum LogEntryType
00128 {
00129 LOG_ENTRY_HTTP = 0,
00130 LOG_ENTRY_ICP,
00131 N_LOG_ENTRY_TYPES
00132 };
00133
00134 enum LogFinishCodeType
00135 {
00136 LOG_FINISH_FIN = 0,
00137 LOG_FINISH_INTR,
00138 LOG_FINISH_TIMEOUT,
00139 N_LOG_FINISH_CODE_TYPES
00140 };
00141
00142 enum LogCacheWriteCodeType
00143 {
00144 LOG_CACHE_WRITE_NONE = 0,
00145 LOG_CACHE_WRITE_LOCK_MISSED,
00146 LOG_CACHE_WRITE_LOCK_ABORTED,
00147 LOG_CACHE_WRITE_ERROR,
00148 LOG_CACHE_WRITE_COMPLETE,
00149 N_LOG_CACHE_WRITE_TYPES
00150 };
00151
00152
00153 class LogAccess
00154 {
00155 public:
00156 inkcoreapi LogAccess()
00157 : initialized(false)
00158 { }
00159
00160 inkcoreapi virtual ~LogAccess()
00161 { }
00162
00163 inkcoreapi virtual void init();
00164
00165 virtual LogEntryType entry_type() = 0;
00166
00167
00168
00169
00170 inkcoreapi virtual int marshal_client_host_ip(char *);
00171 inkcoreapi virtual int marshal_client_host_port(char *);
00172 inkcoreapi virtual int marshal_client_auth_user_name(char *);
00173 int marshal_client_req_timestamp_sec(char *);
00174
00175 inkcoreapi virtual int marshal_client_req_text(char *);
00176 inkcoreapi virtual int marshal_client_req_http_method(char *);
00177 inkcoreapi virtual int marshal_client_req_url(char *);
00178 inkcoreapi virtual int marshal_client_req_url_canon(char *);
00179 inkcoreapi virtual int marshal_client_req_unmapped_url_canon(char *);
00180 inkcoreapi virtual int marshal_client_req_unmapped_url_path(char *);
00181 inkcoreapi virtual int marshal_client_req_unmapped_url_host(char *);
00182 inkcoreapi virtual int marshal_client_req_url_path(char *);
00183 inkcoreapi virtual int marshal_client_req_url_scheme(char *);
00184 inkcoreapi virtual int marshal_client_req_http_version(char *);
00185 inkcoreapi virtual int marshal_client_req_header_len(char *);
00186 inkcoreapi virtual int marshal_client_req_body_len(char *);
00187 inkcoreapi virtual int marshal_client_finish_status_code(char *);
00188
00189
00190
00191
00192 inkcoreapi virtual int marshal_proxy_resp_content_type(char *);
00193 inkcoreapi virtual int marshal_proxy_resp_squid_len(char *);
00194 inkcoreapi virtual int marshal_proxy_resp_content_len(char *);
00195 inkcoreapi virtual int marshal_proxy_resp_status_code(char *);
00196 inkcoreapi virtual int marshal_proxy_resp_header_len(char *);
00197 inkcoreapi virtual int marshal_proxy_finish_status_code(char *);
00198 inkcoreapi virtual int marshal_cache_result_code(char *);
00199
00200
00201
00202
00203 inkcoreapi virtual int marshal_proxy_req_header_len(char *);
00204 inkcoreapi virtual int marshal_proxy_req_body_len(char *);
00205 inkcoreapi virtual int marshal_proxy_req_server_name(char *);
00206 inkcoreapi virtual int marshal_proxy_req_server_ip(char *);
00207 inkcoreapi virtual int marshal_proxy_hierarchy_route(char *);
00208 inkcoreapi virtual int marshal_proxy_host_name(char *);
00209 inkcoreapi virtual int marshal_proxy_host_ip(char *);
00210
00211
00212
00213
00214 inkcoreapi virtual int marshal_server_host_ip(char *);
00215 inkcoreapi virtual int marshal_server_host_name(char *);
00216 inkcoreapi virtual int marshal_server_resp_status_code(char *);
00217 inkcoreapi virtual int marshal_server_resp_content_len(char *);
00218 inkcoreapi virtual int marshal_server_resp_header_len(char *);
00219 inkcoreapi virtual int marshal_server_resp_http_version(char *);
00220
00221
00222
00223
00224 inkcoreapi virtual int marshal_cache_resp_status_code(char *);
00225 inkcoreapi virtual int marshal_cache_resp_content_len(char *);
00226 inkcoreapi virtual int marshal_cache_resp_header_len(char *);
00227 inkcoreapi virtual int marshal_cache_resp_http_version(char *);
00228
00229
00230 inkcoreapi virtual void set_client_req_url(char *, int) {};
00231 inkcoreapi virtual void set_client_req_url_canon(char *, int) {};
00232 inkcoreapi virtual void set_client_req_unmapped_url_canon(char *, int) {};
00233 inkcoreapi virtual void set_client_req_unmapped_url_path(char *, int) {};
00234 inkcoreapi virtual void set_client_req_unmapped_url_host(char *, int) {};
00235 inkcoreapi virtual void set_client_req_url_path(char *, int) {};
00236
00237
00238
00239
00240 inkcoreapi virtual int marshal_client_retry_after_time(char *);
00241
00242
00243
00244
00245 inkcoreapi virtual int marshal_cache_write_code(char *);
00246 inkcoreapi virtual int marshal_cache_write_transform_code(char *);
00247
00248
00249
00250 inkcoreapi virtual int marshal_transfer_time_ms(char *);
00251 inkcoreapi virtual int marshal_transfer_time_s(char *);
00252 inkcoreapi virtual int marshal_file_size(char *);
00253 inkcoreapi virtual int marshal_plugin_identity_id(char *);
00254 inkcoreapi virtual int marshal_plugin_identity_tag(char *);
00255 int marshal_entry_type(char *);
00256
00257
00258
00259
00260 inkcoreapi virtual int marshal_http_header_field(LogField::Container container, char *field, char *buf);
00261 inkcoreapi virtual int marshal_http_header_field_escapify(LogField::Container container, char *field, char *buf);
00262
00263
00264
00265
00266 int marshal_config_int_var(char *config_var, char *buf);
00267
00268
00269
00270
00271 int marshal_config_str_var(char *config_var, char *buf);
00272
00273
00274
00275
00276 int marshal_record(char *record, char *buf);
00277
00278
00279
00280
00281
00282
00283
00284 static int64_t unmarshal_int(char **buf);
00285 static int unmarshal_itoa(int64_t val, char *dest, int field_width = 0, char leading_char = ' ');
00286 static int unmarshal_itox(int64_t val, char *dest, int field_width = 0, char leading_char = ' ');
00287 static int unmarshal_int_to_str(char **buf, char *dest, int len);
00288 static int unmarshal_int_to_str_hex(char **buf, char *dest, int len);
00289 static int unmarshal_str(char **buf, char *dest, int len, LogSlice *slice = NULL);
00290 static int unmarshal_ttmsf(char **buf, char *dest, int len);
00291 static int unmarshal_http_version(char **buf, char *dest, int len);
00292 static int unmarshal_http_text(char **buf, char *dest, int len, LogSlice *slice = NULL);
00293 static int unmarshal_http_status(char **buf, char *dest, int len);
00294 static int unmarshal_ip(char** buf, IpEndpoint* dest);
00295 static int unmarshal_ip_to_str(char **buf, char *dest, int len);
00296 static int unmarshal_ip_to_hex(char** buf, char* dest, int len);
00297 static int unmarshal_hierarchy(char **buf, char *dest, int len, Ptr<LogFieldAliasMap> map);
00298 static int unmarshal_finish_status(char **buf, char *dest, int len, Ptr<LogFieldAliasMap> map);
00299 static int unmarshal_cache_code(char **buf, char *dest, int len, Ptr<LogFieldAliasMap> map);
00300 static int unmarshal_entry_type(char **buf, char *dest, int len, Ptr<LogFieldAliasMap> map);
00301 static int unmarshal_cache_write_code(char **buf, char *dest, int len, Ptr<LogFieldAliasMap> map);
00302 static int unmarshal_client_protocol_stack(char **buf, char *dest, int len, Ptr<LogFieldAliasMap> map);
00303
00304 static int unmarshal_with_map(int64_t code, char *dest, int len, Ptr<LogFieldAliasMap> map, const char *msg = 0);
00305
00306 static int unmarshal_record(char **buf, char *dest, int len);
00307
00308
00309
00310
00311
00312 static int round_strlen(int len);
00313 static int strlen(char const* str);
00314
00315 public:
00316 inkcoreapi static void marshal_int(char *dest, int64_t source);
00317 inkcoreapi static void marshal_str(char *dest, const char *source, int padded_len);
00318 inkcoreapi static void marshal_mem(char *dest, const char *source, int actual_len, int padded_len);
00319 inkcoreapi static int marshal_ip(char *dest, sockaddr const* ip);
00320
00321 bool initialized;
00322
00323 private:
00324
00325 LogAccess(const LogAccess & rhs);
00326 LogAccess & operator=(LogAccess & rhs);
00327 };
00328
00329 inline int
00330 LogAccess::round_strlen(int len)
00331 {
00332 return INK_ALIGN_DEFAULT(len);
00333 }
00334
00335
00336
00337
00338
00339
00340
00341
00342 inline int
00343 LogAccess::strlen(char const* str)
00344 {
00345 if (str == NULL || str[0] == 0) {
00346 return round_strlen(sizeof(DEFAULT_STR));
00347 } else {
00348 return (int) (round_strlen(((int)::strlen(str) + 1)));
00349 }
00350 }
00351
00352 inline void
00353 LogAccess::marshal_int(char *dest, int64_t source)
00354 {
00355
00356 *((int64_t *)dest) = source;
00357 }
00358
00359
00360
00361
00362
00363
00364
00365
00366 char *resolve_logfield_string(LogAccess * context, const char *format_str);
00367
00368 #endif