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