• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

HttpConfig.cc

Go to the documentation of this file.
00001 /** @file
00002 
00003   A brief file description
00004 
00005   @section license License
00006 
00007   Licensed to the Apache Software Foundation (ASF) under one
00008   or more contributor license agreements.  See the NOTICE file
00009   distributed with this work for additional information
00010   regarding copyright ownership.  The ASF licenses this file
00011   to you under the Apache License, Version 2.0 (the
00012   "License"); you may not use this file except in compliance
00013   with the License.  You may obtain a copy of the License at
00014 
00015       http://www.apache.org/licenses/LICENSE-2.0
00016 
00017   Unless required by applicable law or agreed to in writing, software
00018   distributed under the License is distributed on an "AS IS" BASIS,
00019   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00020   See the License for the specific language governing permissions and
00021   limitations under the License.
00022  */
00023 
00024 #include "ink_config.h"
00025 #include <ctype.h>
00026 #include <string.h>
00027 #include "HttpConfig.h"
00028 #include "HTTP.h"
00029 #include "ProcessManager.h"
00030 #include "ProxyConfig.h"
00031 #include "ICPProcessor.h"
00032 #include "P_Net.h"
00033 #include "P_RecUtils.h"
00034 #include <records/I_RecHttp.h>
00035 
00036 #ifndef min
00037 #define         min(a,b)        ((a) < (b) ? (a) : (b))
00038 #endif
00039 #ifndef max
00040 #define         max(a,b)        ((a) > (b) ? (a) : (b))
00041 #endif
00042 
00043 #define HttpEstablishStaticConfigStringAlloc(_ix,_n) \
00044   REC_EstablishStaticConfigStringAlloc(_ix,_n); \
00045   REC_RegisterConfigUpdateFunc(_n, http_config_cb, NULL)
00046 
00047 #define HttpEstablishStaticConfigLongLong(_ix,_n) \
00048   REC_EstablishStaticConfigInteger(_ix,_n); \
00049   REC_RegisterConfigUpdateFunc(_n, http_config_cb, NULL)
00050 
00051 #define HttpEstablishStaticConfigFloat(_ix,_n) \
00052   REC_EstablishStaticConfigFloat(_ix,_n); \
00053   REC_RegisterConfigUpdateFunc(_n, http_config_cb, NULL)
00054 
00055 #define HttpEstablishStaticConfigByte(_ix,_n) \
00056   REC_EstablishStaticConfigByte(_ix,_n); \
00057   REC_RegisterConfigUpdateFunc(_n, http_config_cb, NULL)
00058 
00059 
00060 RecRawStatBlock *http_rsb;
00061 #define HTTP_CLEAR_DYN_STAT(x) \
00062 do { \
00063         RecSetRawStatSum(http_rsb, x, 0); \
00064         RecSetRawStatCount(http_rsb, x, 0); \
00065 } while (0);
00066 
00067 
00068 class HttpConfigCont:public Continuation
00069 {
00070 public:
00071   HttpConfigCont();
00072   int handle_event(int event, void *edata);
00073 };
00074 
00075 /// Data item for enumerated type config value.
00076 template <typename T> struct ConfigEnumPair
00077 {
00078   T _value;
00079   char const* _key;
00080 };
00081 
00082 /// Convert a string to an enumeration value.
00083 /// @a n is the number of entries in the list.
00084 /// @return @c true if the string is found, @c false if not found.
00085 /// If found @a value is set to the corresponding value in @a list.
00086 template <typename T> static bool
00087 http_config_enum_search(char const* key, ConfigEnumPair<T>* list, size_t n, MgmtByte value)
00088 {
00089   // We don't expect any of these lists to be more than 10 long, so a linear search is the best choice.
00090   for ( size_t i = 0 ; i < n ; ++i ) {
00091     if (0 == strcasecmp(list[i]._key, key)) {
00092       value = list[i]._value;
00093       return true;
00094     }
00095   }
00096   return false;
00097 }
00098 
00099 /// Read a string from the configuration and convert it to an enumeration value.
00100 /// @a n is the number of entries in the list.
00101 /// @return @c true if the string is found, @c false if not found.
00102 /// If found @a value is set to the corresponding value in @a list.
00103 template <typename T> static bool
00104 http_config_enum_read(char const* name, ConfigEnumPair<T>* list, size_t n, MgmtByte value)
00105 {
00106   char key[512]; // it's just one key - painful UI if keys are longer than this
00107   if (REC_ERR_OKAY == RecGetRecordString(name, key, sizeof(key))) {
00108     return http_config_enum_search(key, list, n, value);
00109   }
00110   return false;
00111 }
00112 
00113 /// Session sharing match types.
00114 static
00115 ConfigEnumPair<TSServerSessionSharingMatchType> SessionSharingMatchStrings[] =
00116 {
00117   { TS_SERVER_SESSION_SHARING_MATCH_NONE, "none" },
00118   { TS_SERVER_SESSION_SHARING_MATCH_IP, "ip" },
00119   { TS_SERVER_SESSION_SHARING_MATCH_HOST, "host" },
00120   { TS_SERVER_SESSION_SHARING_MATCH_BOTH, "both" }
00121 };
00122   
00123 static
00124 ConfigEnumPair<TSServerSessionSharingPoolType> SessionSharingPoolStrings[] =
00125 {
00126   { TS_SERVER_SESSION_SHARING_POOL_GLOBAL, "global" },
00127   { TS_SERVER_SESSION_SHARING_POOL_THREAD, "thread" }
00128 };
00129 
00130 # define ARRAY_SIZE(x) (sizeof(x)/(sizeof((x)[0])))
00131 
00132 ////////////////////////////////////////////////////////////////
00133 //
00134 //  static variables
00135 //
00136 ////////////////////////////////////////////////////////////////
00137 int HttpConfig::m_id = 0;
00138 HttpConfigParams HttpConfig::m_master;
00139 HttpUserAgent_RegxEntry *HttpConfig::user_agent_list = NULL;
00140 
00141 static volatile int http_config_changes = 1;
00142 static HttpConfigCont *http_config_cont = NULL;
00143 
00144 
00145 HttpConfigCont::HttpConfigCont()
00146   : Continuation(new_ProxyMutex())
00147 {
00148   SET_HANDLER(&HttpConfigCont::handle_event);
00149 }
00150 
00151 int
00152 HttpConfigCont::handle_event(int /* event ATS_UNUSED */, void * /* edata ATS_UNUSED */)
00153 {
00154   if (ink_atomic_increment((int *) &http_config_changes, -1) == 1) {
00155     HttpConfig::reconfigure();
00156   }
00157   return 0;
00158 }
00159 
00160 
00161 static int
00162 http_config_cb(const char * /* name ATS_UNUSED */, RecDataT /* data_type ATS_UNUSED */,
00163                RecData /* data ATS_UNUSED */, void * /* cookie ATS_UNUSED */)
00164 {
00165   ink_atomic_increment((int *) &http_config_changes, 1);
00166 
00167   INK_MEMORY_BARRIER;
00168 
00169   eventProcessor.schedule_in(http_config_cont, HRTIME_SECONDS(1), ET_CALL);
00170   return 0;
00171 }
00172 
00173 // Convert from the old share_server_session value to the new config vars.
00174 static void
00175 http_config_share_server_sessions_bc(HttpConfigParams* c, MgmtByte v)
00176 {
00177   switch (v) {
00178   case 0:
00179     c->oride.server_session_sharing_match = TS_SERVER_SESSION_SHARING_MATCH_NONE;
00180     c->oride.server_session_sharing_pool = TS_SERVER_SESSION_SHARING_POOL_GLOBAL;
00181     break;
00182   case 1:
00183     c->oride.server_session_sharing_match = TS_SERVER_SESSION_SHARING_MATCH_BOTH;
00184     c->oride.server_session_sharing_pool = TS_SERVER_SESSION_SHARING_POOL_GLOBAL;
00185     break;
00186   case 2:
00187     c->oride.server_session_sharing_match = TS_SERVER_SESSION_SHARING_MATCH_BOTH;
00188     c->oride.server_session_sharing_pool = TS_SERVER_SESSION_SHARING_POOL_THREAD;
00189     break;
00190   }
00191 }
00192 
00193 static void
00194 http_config_share_server_sessions_read_bc(HttpConfigParams* c)
00195 {
00196   MgmtByte v;
00197   if (REC_ERR_OKAY == RecGetRecordByte("proxy.config.http.share_server_sessions", &v)) 
00198     http_config_share_server_sessions_bc(c, v);
00199 }
00200 
00201 // [amc] Not sure which is uglier, this switch or having a micro-function for each var.
00202 // Oh, how I long for when we can use C++eleventy lambdas without compiler problems!
00203 // I think for 5.0 when the BC stuff is yanked, we should probably revert this to independent callbacks.
00204 static int
00205 http_server_session_sharing_cb(char const* name, RecDataT dtype, RecData data, void* cookie)
00206 {
00207   bool valid_p = true;
00208   HttpConfigParams* c = static_cast<HttpConfigParams*>(cookie);
00209 
00210   if (0 == strcasecmp("proxy.config.http.server_session_sharing.pool", name)) {
00211     MgmtByte& match = c->oride.server_session_sharing_match;
00212     if (RECD_INT == dtype) {
00213       match = static_cast<TSServerSessionSharingMatchType>(data.rec_int);
00214     } else if (RECD_STRING == dtype && http_config_enum_search(data.rec_string, SessionSharingMatchStrings, ARRAY_SIZE(SessionSharingMatchStrings), match)) {
00215       // empty
00216     } else {
00217       valid_p = false;
00218     }
00219   } else if (0 == strcasecmp("proxy.config.http.server_session_sharing.match", name)) {
00220     MgmtByte& match = c->oride.server_session_sharing_pool;
00221     if (RECD_INT == dtype) {
00222       match = static_cast<TSServerSessionSharingPoolType>(data.rec_int);
00223     } else if (RECD_STRING == dtype && http_config_enum_search(data.rec_string, SessionSharingPoolStrings, ARRAY_SIZE(SessionSharingPoolStrings), match)) {
00224       // empty
00225     } else {
00226       valid_p = false;
00227     }
00228   } else if (0 == strcasecmp("proxy.config.http.share_server_sessions", name) && RECD_INT == dtype) {
00229     http_config_share_server_sessions_bc(c, data.rec_int);
00230   } else {
00231     valid_p = false;
00232   }
00233 
00234   // Signal an update if valid value arrived.
00235   if (valid_p) 
00236     http_config_cb(name, dtype, data, cookie);
00237 
00238  return REC_ERR_OKAY;
00239 }
00240 
00241 void
00242 register_configs()
00243 {
00244 }
00245 
00246 void
00247 register_stat_callbacks()
00248 {
00249 
00250   // Dynamic stats
00251 
00252   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00253                      "proxy.process.http.background_fill_current_count",
00254                      RECD_INT, RECP_NON_PERSISTENT, (int) http_background_fill_current_count_stat, RecRawStatSyncSum);
00255   HTTP_CLEAR_DYN_STAT(http_background_fill_current_count_stat);
00256   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00257                      "proxy.process.http.current_client_connections",
00258                      RECD_INT, RECP_NON_PERSISTENT, (int) http_current_client_connections_stat, RecRawStatSyncSum);
00259   HTTP_CLEAR_DYN_STAT(http_current_client_connections_stat);
00260   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00261                      "proxy.process.http.current_active_client_connections",
00262                      RECD_INT, RECP_NON_PERSISTENT,
00263                      (int) http_current_active_client_connections_stat, RecRawStatSyncSum);
00264   HTTP_CLEAR_DYN_STAT(http_current_active_client_connections_stat);
00265   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00266                      "proxy.process.http.websocket.current_active_client_connections",
00267                      RECD_INT, RECP_NON_PERSISTENT,
00268                      (int) http_websocket_current_active_client_connections_stat, RecRawStatSyncSum);
00269   HTTP_CLEAR_DYN_STAT(http_websocket_current_active_client_connections_stat);
00270   // Current Transaction Stats
00271   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00272                      "proxy.process.http.current_client_transactions",
00273                      RECD_INT, RECP_NON_PERSISTENT, (int) http_current_client_transactions_stat, RecRawStatSyncSum);
00274   HTTP_CLEAR_DYN_STAT(http_current_client_transactions_stat);
00275   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00276                      "proxy.process.http.current_parent_proxy_transactions",
00277                      RECD_INT, RECP_NON_PERSISTENT,
00278                      (int) http_current_parent_proxy_transactions_stat, RecRawStatSyncSum);
00279   HTTP_CLEAR_DYN_STAT(http_current_parent_proxy_transactions_stat);
00280   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00281                      "proxy.process.http.current_icp_transactions",
00282                      RECD_INT, RECP_NON_PERSISTENT, (int) http_current_icp_transactions_stat, RecRawStatSyncSum);
00283   HTTP_CLEAR_DYN_STAT(http_current_icp_transactions_stat);
00284   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00285                      "proxy.process.http.current_server_transactions",
00286                      RECD_INT, RECP_NON_PERSISTENT, (int) http_current_server_transactions_stat, RecRawStatSyncSum);
00287   HTTP_CLEAR_DYN_STAT(http_current_server_transactions_stat);
00288   // Current Transaction (Raw) Stats
00289   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00290                      "proxy.process.http.current_parent_proxy_raw_transactions",
00291                      RECD_INT, RECP_NON_PERSISTENT,
00292                      (int) http_current_parent_proxy_raw_transactions_stat, RecRawStatSyncSum);
00293   HTTP_CLEAR_DYN_STAT(http_current_parent_proxy_raw_transactions_stat);
00294   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00295                      "proxy.process.http.current_icp_raw_transactions",
00296                      RECD_INT, RECP_NON_PERSISTENT, (int) http_current_icp_raw_transactions_stat, RecRawStatSyncSum);
00297   HTTP_CLEAR_DYN_STAT(http_current_icp_raw_transactions_stat);
00298   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00299                      "proxy.process.http.current_server_raw_transactions",
00300                      RECD_INT, RECP_NON_PERSISTENT, (int) http_current_server_raw_transactions_stat, RecRawStatSyncSum);
00301   HTTP_CLEAR_DYN_STAT(http_current_server_raw_transactions_stat);
00302   // Total connections stats
00303 
00304   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00305                      "proxy.process.http.completed_requests",
00306                      RECD_COUNTER, RECP_PERSISTENT, (int) http_completed_requests_stat, RecRawStatSyncCount);
00307 
00308   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00309                      "proxy.process.http.total_incoming_connections",
00310                      RECD_COUNTER, RECP_PERSISTENT, (int) http_total_incoming_connections_stat, RecRawStatSyncCount);
00311 
00312   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00313                      "proxy.process.http.total_client_connections",
00314                      RECD_COUNTER, RECP_PERSISTENT, (int) http_total_client_connections_stat, RecRawStatSyncCount);
00315 
00316   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00317                      "proxy.process.http.total_client_connections_ipv4",
00318                      RECD_COUNTER, RECP_PERSISTENT, (int) http_total_client_connections_ipv4_stat, RecRawStatSyncCount);
00319 
00320   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00321                      "proxy.process.http.total_client_connections_ipv6",
00322                      RECD_COUNTER, RECP_PERSISTENT, (int) http_total_client_connections_ipv6_stat, RecRawStatSyncCount);
00323 
00324   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00325                      "proxy.process.http.total_server_connections",
00326                      RECD_COUNTER, RECP_PERSISTENT, (int) http_total_server_connections_stat, RecRawStatSyncCount);
00327 
00328   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00329                      "proxy.process.http.total_parent_proxy_connections",
00330                      RECD_COUNTER, RECP_PERSISTENT, (int) http_total_parent_proxy_connections_stat, RecRawStatSyncCount);
00331 
00332   // Upstream current connections stats
00333   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00334                      "proxy.process.http.current_parent_proxy_connections",
00335                      RECD_INT, RECP_NON_PERSISTENT,
00336                      (int) http_current_parent_proxy_connections_stat, RecRawStatSyncSum);
00337   HTTP_CLEAR_DYN_STAT(http_current_parent_proxy_connections_stat);
00338   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00339                      "proxy.process.http.current_server_connections",
00340                      RECD_INT, RECP_NON_PERSISTENT, (int) http_current_server_connections_stat, RecRawStatSyncSum);
00341   HTTP_CLEAR_DYN_STAT(http_current_server_connections_stat);
00342   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00343                      "proxy.process.http.current_cache_connections",
00344                      RECD_INT, RECP_NON_PERSISTENT, (int) http_current_cache_connections_stat, RecRawStatSyncSum);
00345   HTTP_CLEAR_DYN_STAT(http_current_cache_connections_stat);
00346   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00347                      "proxy.process.http.avg_transactions_per_client_connection",
00348                      RECD_FLOAT, RECP_PERSISTENT, (int) http_transactions_per_client_con, RecRawStatSyncAvg);
00349 
00350   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00351                      "proxy.process.http.avg_transactions_per_server_connection",
00352                      RECD_FLOAT, RECP_PERSISTENT, (int) http_transactions_per_server_con, RecRawStatSyncAvg);
00353 
00354   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00355                      "proxy.process.http.avg_transactions_per_parent_connection",
00356                      RECD_FLOAT, RECP_PERSISTENT, (int) http_transactions_per_parent_con, RecRawStatSyncAvg);
00357 
00358   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00359                      "proxy.process.http.client_connection_time",
00360                      RECD_INT, RECP_PERSISTENT, (int) http_client_connection_time_stat, RecRawStatSyncSum);
00361 
00362   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00363                      "proxy.process.http.parent_proxy_connection_time",
00364                      RECD_INT, RECP_PERSISTENT, (int) http_parent_proxy_connection_time_stat, RecRawStatSyncSum);
00365 
00366   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00367                      "proxy.process.http.server_connection_time",
00368                      RECD_INT, RECP_PERSISTENT, (int) http_server_connection_time_stat, RecRawStatSyncSum);
00369 
00370   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00371                      "proxy.process.http.cache_connection_time",
00372                      RECD_INT, RECP_PERSISTENT, (int) http_cache_connection_time_stat, RecRawStatSyncSum);
00373 
00374   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00375                      "proxy.process.http.transaction_counts.errors.pre_accept_hangups",
00376                      RECD_COUNTER, RECP_PERSISTENT,
00377                      (int) http_ua_msecs_counts_errors_pre_accept_hangups_stat, RecRawStatSyncCount);
00378 
00379   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00380                      "proxy.process.http.transaction_totaltime.errors.pre_accept_hangups",
00381                      RECD_FLOAT, RECP_PERSISTENT,
00382                      (int) http_ua_msecs_counts_errors_pre_accept_hangups_stat, RecRawStatSyncIntMsecsToFloatSeconds);
00383 
00384   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00385                      "proxy.process.http.transaction_counts.errors.empty_hangups",
00386                      RECD_COUNTER, RECP_PERSISTENT,
00387                      (int) http_ua_msecs_counts_errors_empty_hangups_stat, RecRawStatSyncCount);
00388 
00389   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00390                      "proxy.process.http.transaction_totaltime.errors.empty_hangups",
00391                      RECD_FLOAT, RECP_PERSISTENT, (int) http_ua_msecs_counts_errors_empty_hangups_stat, RecRawStatSyncCount);
00392 
00393   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00394                      "proxy.process.http.transaction_counts.errors.early_hangups",
00395                      RECD_COUNTER, RECP_PERSISTENT,
00396                      (int) http_ua_msecs_counts_errors_early_hangups_stat, RecRawStatSyncCount);
00397 
00398   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00399                      "proxy.process.http.transaction_totaltime.errors.early_hangups",
00400                      RECD_FLOAT, RECP_PERSISTENT, (int) http_ua_msecs_counts_errors_early_hangups_stat, RecRawStatSyncCount);
00401 
00402 
00403 
00404   // Transactional stats
00405 
00406   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00407                      "proxy.process.http.incoming_requests",
00408                      RECD_COUNTER, RECP_PERSISTENT, (int) http_incoming_requests_stat, RecRawStatSyncCount);
00409 
00410   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00411                      "proxy.process.http.outgoing_requests",
00412                      RECD_COUNTER, RECP_PERSISTENT, (int) http_outgoing_requests_stat, RecRawStatSyncCount);
00413 
00414   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00415                      "proxy.process.http.incoming_responses",
00416                      RECD_COUNTER, RECP_PERSISTENT, (int) http_incoming_responses_stat, RecRawStatSyncCount);
00417 
00418   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00419                      "proxy.process.http.invalid_client_requests",
00420                      RECD_COUNTER, RECP_PERSISTENT, (int) http_invalid_client_requests_stat, RecRawStatSyncCount);
00421 
00422   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00423                      "proxy.process.http.missing_host_hdr",
00424                      RECD_COUNTER, RECP_PERSISTENT, (int) http_missing_host_hdr_stat, RecRawStatSyncCount);
00425 
00426   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00427                      "proxy.process.http.get_requests",
00428                      RECD_COUNTER, RECP_PERSISTENT, (int) http_get_requests_stat, RecRawStatSyncCount);
00429 
00430   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00431                      "proxy.process.http.head_requests",
00432                      RECD_COUNTER, RECP_PERSISTENT, (int) http_head_requests_stat, RecRawStatSyncCount);
00433 
00434   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00435                      "proxy.process.http.trace_requests",
00436                      RECD_COUNTER, RECP_PERSISTENT, (int) http_trace_requests_stat, RecRawStatSyncCount);
00437 
00438   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00439                      "proxy.process.http.options_requests",
00440                      RECD_COUNTER, RECP_PERSISTENT, (int) http_options_requests_stat, RecRawStatSyncCount);
00441 
00442   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00443                      "proxy.process.http.post_requests",
00444                      RECD_COUNTER, RECP_PERSISTENT, (int) http_post_requests_stat, RecRawStatSyncCount);
00445 
00446   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00447                      "proxy.process.http.put_requests",
00448                      RECD_COUNTER, RECP_PERSISTENT, (int) http_put_requests_stat, RecRawStatSyncCount);
00449 
00450   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00451                      "proxy.process.http.push_requests",
00452                      RECD_COUNTER, RECP_PERSISTENT, (int) http_push_requests_stat, RecRawStatSyncCount);
00453 
00454   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00455                      "proxy.process.http.delete_requests",
00456                      RECD_COUNTER, RECP_PERSISTENT, (int) http_delete_requests_stat, RecRawStatSyncCount);
00457 
00458   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00459                      "proxy.process.http.purge_requests",
00460                      RECD_COUNTER, RECP_PERSISTENT, (int) http_purge_requests_stat, RecRawStatSyncCount);
00461 
00462   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00463                      "proxy.process.http.connect_requests",
00464                      RECD_COUNTER, RECP_PERSISTENT, (int) http_connect_requests_stat, RecRawStatSyncCount);
00465 
00466   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00467                      "proxy.process.http.extension_method_requests",
00468                      RECD_COUNTER, RECP_PERSISTENT, (int) http_extension_method_requests_stat, RecRawStatSyncCount);
00469 
00470   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00471                      "proxy.process.http.client_no_cache_requests",
00472                      RECD_COUNTER, RECP_PERSISTENT, (int) http_client_no_cache_requests_stat, RecRawStatSyncCount);
00473 
00474   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00475                      "proxy.process.http.broken_server_connections",
00476                      RECD_COUNTER, RECP_PERSISTENT, (int) http_broken_server_connections_stat, RecRawStatSyncCount);
00477 
00478   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00479                      "proxy.process.http.cache_lookups",
00480                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_lookups_stat, RecRawStatSyncCount);
00481 
00482   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00483                      "proxy.process.http.cache_writes",
00484                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_writes_stat, RecRawStatSyncCount);
00485 
00486   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00487                      "proxy.process.http.cache_updates",
00488                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_updates_stat, RecRawStatSyncCount);
00489 
00490   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00491                      "proxy.process.http.cache_deletes",
00492                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_deletes_stat, RecRawStatSyncCount);
00493 
00494   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00495                      "proxy.process.http.tunnels",
00496                      RECD_COUNTER, RECP_PERSISTENT, (int) http_tunnels_stat, RecRawStatSyncCount);
00497 
00498   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00499                      "proxy.process.http.throttled_proxy_only",
00500                      RECD_COUNTER, RECP_PERSISTENT, (int) http_throttled_proxy_only_stat, RecRawStatSyncCount);
00501 
00502   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00503                      "proxy.process.http.icp_suggested_lookups",
00504                      RECD_COUNTER, RECP_PERSISTENT, (int) http_icp_suggested_lookups_stat, RecRawStatSyncCount);
00505 
00506   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00507                      "proxy.process.http.client_transaction_time",
00508                      RECD_INT, RECP_PERSISTENT, (int) http_client_transaction_time_stat, RecRawStatSyncSum);
00509 
00510   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00511                      "proxy.process.http.client_write_time",
00512                      RECD_INT, RECP_PERSISTENT, (int) http_client_write_time_stat, RecRawStatSyncSum);
00513 
00514   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00515                      "proxy.process.http.server_read_time",
00516                      RECD_INT, RECP_PERSISTENT, (int) http_server_read_time_stat, RecRawStatSyncSum);
00517 
00518   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00519                      "proxy.process.http.icp_transaction_time",
00520                      RECD_INT, RECP_PERSISTENT, (int) http_icp_transaction_time_stat, RecRawStatSyncSum);
00521 
00522   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00523                      "proxy.process.http.icp_raw_transaction_time",
00524                      RECD_INT, RECP_PERSISTENT, (int) http_icp_raw_transaction_time_stat, RecRawStatSyncSum);
00525 
00526   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00527                      "proxy.process.http.parent_proxy_transaction_time",
00528                      RECD_INT, RECP_PERSISTENT, (int) http_parent_proxy_transaction_time_stat, RecRawStatSyncSum);
00529 
00530   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00531                      "proxy.process.http.parent_proxy_raw_transaction_time",
00532                      RECD_INT, RECP_PERSISTENT, (int) http_parent_proxy_raw_transaction_time_stat, RecRawStatSyncSum);
00533 
00534   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00535                      "proxy.process.http.server_transaction_time",
00536                      RECD_INT, RECP_PERSISTENT, (int) http_server_transaction_time_stat, RecRawStatSyncSum);
00537 
00538   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00539                      "proxy.process.http.server_raw_transaction_time",
00540                      RECD_INT, RECP_PERSISTENT, (int) http_server_raw_transaction_time_stat, RecRawStatSyncSum);
00541 
00542   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00543                      "proxy.process.http.user_agent_request_header_total_size",
00544                      RECD_INT, RECP_PERSISTENT, (int) http_user_agent_request_header_total_size_stat, RecRawStatSyncSum);
00545 
00546   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00547                      "proxy.process.http.user_agent_response_header_total_size",
00548                      RECD_INT, RECP_PERSISTENT, (int) http_user_agent_response_header_total_size_stat, RecRawStatSyncSum);
00549 
00550   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00551                      "proxy.process.http.user_agent_request_document_total_size",
00552                      RECD_INT, RECP_PERSISTENT, (int) http_user_agent_request_document_total_size_stat, RecRawStatSyncSum);
00553 
00554   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00555                      "proxy.process.http.user_agent_response_document_total_size",
00556                      RECD_INT, RECP_PERSISTENT, (int) http_user_agent_response_document_total_size_stat, RecRawStatSyncSum);
00557 
00558   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00559                      "proxy.process.http.origin_server_request_header_total_size",
00560                      RECD_INT, RECP_PERSISTENT, (int) http_origin_server_request_header_total_size_stat, RecRawStatSyncSum);
00561 
00562   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00563                      "proxy.process.http.origin_server_response_header_total_size",
00564                      RECD_INT, RECP_PERSISTENT, (int) http_origin_server_response_header_total_size_stat, RecRawStatSyncSum);
00565 
00566   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00567                      "proxy.process.http.origin_server_request_document_total_size",
00568                      RECD_INT, RECP_PERSISTENT, (int) http_origin_server_request_document_total_size_stat, RecRawStatSyncSum);
00569 
00570   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00571                      "proxy.process.http.origin_server_response_document_total_size",
00572                      RECD_INT, RECP_PERSISTENT,
00573                      (int) http_origin_server_response_document_total_size_stat, RecRawStatSyncSum);
00574 
00575   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00576                      "proxy.process.http.parent_proxy_request_total_bytes",
00577                      RECD_INT, RECP_PERSISTENT, (int) http_parent_proxy_request_total_bytes_stat, RecRawStatSyncSum);
00578 
00579   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00580                      "proxy.process.http.parent_proxy_response_total_bytes",
00581                      RECD_INT, RECP_PERSISTENT, (int) http_parent_proxy_response_total_bytes_stat, RecRawStatSyncSum);
00582 
00583   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00584                      "proxy.process.http.pushed_response_header_total_size",
00585                      RECD_INT, RECP_PERSISTENT, (int) http_pushed_response_header_total_size_stat, RecRawStatSyncSum);
00586 
00587   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00588                      "proxy.process.http.pushed_document_total_size",
00589                      RECD_INT, RECP_PERSISTENT, (int) http_pushed_document_total_size_stat, RecRawStatSyncSum);
00590 
00591   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00592                      "proxy.process.http.response_document_size_100",
00593                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_document_size_100_stat, RecRawStatSyncCount);
00594 
00595   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00596                      "proxy.process.http.response_document_size_1K",
00597                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_document_size_1K_stat, RecRawStatSyncCount);
00598 
00599   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00600                      "proxy.process.http.response_document_size_3K",
00601                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_document_size_3K_stat, RecRawStatSyncCount);
00602 
00603   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00604                      "proxy.process.http.response_document_size_5K",
00605                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_document_size_5K_stat, RecRawStatSyncCount);
00606 
00607   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00608                      "proxy.process.http.response_document_size_10K",
00609                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_document_size_10K_stat, RecRawStatSyncCount);
00610 
00611   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00612                      "proxy.process.http.response_document_size_1M",
00613                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_document_size_1M_stat, RecRawStatSyncCount);
00614 
00615   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00616                      "proxy.process.http.response_document_size_inf",
00617                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_document_size_inf_stat, RecRawStatSyncCount);
00618 
00619   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00620                      "proxy.process.http.request_document_size_100",
00621                      RECD_COUNTER, RECP_PERSISTENT, (int) http_request_document_size_100_stat, RecRawStatSyncCount);
00622 
00623   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00624                      "proxy.process.http.request_document_size_1K",
00625                      RECD_COUNTER, RECP_PERSISTENT, (int) http_request_document_size_1K_stat, RecRawStatSyncCount);
00626 
00627   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00628                      "proxy.process.http.request_document_size_3K",
00629                      RECD_COUNTER, RECP_PERSISTENT, (int) http_request_document_size_3K_stat, RecRawStatSyncCount);
00630 
00631   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00632                      "proxy.process.http.request_document_size_5K",
00633                      RECD_COUNTER, RECP_PERSISTENT, (int) http_request_document_size_5K_stat, RecRawStatSyncCount);
00634 
00635   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00636                      "proxy.process.http.request_document_size_10K",
00637                      RECD_COUNTER, RECP_PERSISTENT, (int) http_request_document_size_10K_stat, RecRawStatSyncCount);
00638 
00639   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00640                      "proxy.process.http.request_document_size_1M",
00641                      RECD_COUNTER, RECP_PERSISTENT, (int) http_request_document_size_1M_stat, RecRawStatSyncCount);
00642 
00643   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00644                      "proxy.process.http.request_document_size_inf",
00645                      RECD_COUNTER, RECP_PERSISTENT, (int) http_request_document_size_inf_stat, RecRawStatSyncCount);
00646 
00647   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00648                      "proxy.process.http.user_agent_speed_bytes_per_sec_100",
00649                      RECD_COUNTER, RECP_PERSISTENT, (int) http_user_agent_speed_bytes_per_sec_100_stat, RecRawStatSyncCount);
00650 
00651   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00652                      "proxy.process.http.user_agent_speed_bytes_per_sec_1K",
00653                      RECD_COUNTER, RECP_PERSISTENT, (int) http_user_agent_speed_bytes_per_sec_1K_stat, RecRawStatSyncCount);
00654 
00655   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00656                      "proxy.process.http.user_agent_speed_bytes_per_sec_10K",
00657                      RECD_COUNTER, RECP_PERSISTENT, (int) http_user_agent_speed_bytes_per_sec_10K_stat, RecRawStatSyncCount);
00658 
00659   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00660                      "proxy.process.http.user_agent_speed_bytes_per_sec_100K",
00661                      RECD_COUNTER, RECP_PERSISTENT, (int) http_user_agent_speed_bytes_per_sec_100K_stat, RecRawStatSyncCount);
00662 
00663   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00664                      "proxy.process.http.user_agent_speed_bytes_per_sec_1M",
00665                      RECD_COUNTER, RECP_PERSISTENT, (int) http_user_agent_speed_bytes_per_sec_1M_stat, RecRawStatSyncCount);
00666 
00667   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00668                      "proxy.process.http.user_agent_speed_bytes_per_sec_10M",
00669                      RECD_COUNTER, RECP_PERSISTENT, (int) http_user_agent_speed_bytes_per_sec_10M_stat, RecRawStatSyncCount);
00670 
00671   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00672                      "proxy.process.http.user_agent_speed_bytes_per_sec_100M",
00673                      RECD_COUNTER, RECP_PERSISTENT, (int) http_user_agent_speed_bytes_per_sec_100M_stat, RecRawStatSyncCount);
00674 
00675   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00676                      "proxy.process.http.origin_server_speed_bytes_per_sec_100",
00677                      RECD_COUNTER, RECP_PERSISTENT,
00678                      (int) http_origin_server_speed_bytes_per_sec_100_stat, RecRawStatSyncCount);
00679 
00680   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00681                      "proxy.process.http.origin_server_speed_bytes_per_sec_1K",
00682                      RECD_COUNTER, RECP_PERSISTENT,
00683                      (int) http_origin_server_speed_bytes_per_sec_1K_stat, RecRawStatSyncCount);
00684 
00685   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00686                      "proxy.process.http.origin_server_speed_bytes_per_sec_10K",
00687                      RECD_COUNTER, RECP_PERSISTENT,
00688                      (int) http_origin_server_speed_bytes_per_sec_10K_stat, RecRawStatSyncCount);
00689 
00690   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00691                      "proxy.process.http.origin_server_speed_bytes_per_sec_100K",
00692                      RECD_COUNTER, RECP_PERSISTENT,
00693                      (int) http_origin_server_speed_bytes_per_sec_100K_stat, RecRawStatSyncCount);
00694 
00695   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00696                      "proxy.process.http.origin_server_speed_bytes_per_sec_1M",
00697                      RECD_COUNTER, RECP_PERSISTENT,
00698                      (int) http_origin_server_speed_bytes_per_sec_1M_stat, RecRawStatSyncCount);
00699 
00700   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00701                      "proxy.process.http.origin_server_speed_bytes_per_sec_10M",
00702                      RECD_COUNTER, RECP_PERSISTENT,
00703                      (int) http_origin_server_speed_bytes_per_sec_10M_stat, RecRawStatSyncCount);
00704 
00705   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00706                      "proxy.process.http.origin_server_speed_bytes_per_sec_100M",
00707                      RECD_COUNTER, RECP_PERSISTENT,
00708                      (int) http_origin_server_speed_bytes_per_sec_100M_stat, RecRawStatSyncCount);
00709 
00710   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00711                      "proxy.process.http.total_transactions_time",
00712                      RECD_INT, RECP_PERSISTENT, (int) http_total_transactions_time_stat, RecRawStatSyncSum);
00713 
00714   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00715                      "proxy.process.http.total_transactions_think_time",
00716                      RECD_INT, RECP_PERSISTENT, (int) http_total_transactions_think_time_stat, RecRawStatSyncSum);
00717 
00718   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00719                      "proxy.process.http.cache_hit_fresh",
00720                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_hit_fresh_stat, RecRawStatSyncCount);
00721 
00722   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00723                      "proxy.process.http.cache_hit_mem_fresh",
00724                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_hit_mem_fresh_stat, RecRawStatSyncCount);
00725 
00726   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00727                      "proxy.process.http.cache_hit_revalidated",
00728                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_hit_reval_stat, RecRawStatSyncCount);
00729 
00730   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00731                      "proxy.process.http.cache_hit_ims",
00732                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_hit_ims_stat, RecRawStatSyncCount);
00733 
00734   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00735                      "proxy.process.http.cache_hit_stale_served",
00736                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_hit_stale_served_stat, RecRawStatSyncCount);
00737 
00738   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00739                      "proxy.process.http.cache_miss_cold",
00740                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_miss_cold_stat, RecRawStatSyncCount);
00741 
00742   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00743                      "proxy.process.http.cache_miss_changed",
00744                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_miss_changed_stat, RecRawStatSyncCount);
00745 
00746   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00747                      "proxy.process.http.cache_miss_client_no_cache",
00748                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_miss_client_no_cache_stat, RecRawStatSyncCount);
00749 
00750   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00751                      "proxy.process.http.cache_miss_client_not_cacheable",
00752                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_miss_uncacheable_stat, RecRawStatSyncCount);
00753 
00754   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00755                      "proxy.process.http.cache_miss_ims",
00756                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_miss_ims_stat, RecRawStatSyncCount);
00757 
00758   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00759                      "proxy.process.http.cache_read_error",
00760                      RECD_COUNTER, RECP_PERSISTENT, (int) http_cache_read_error_stat, RecRawStatSyncCount);
00761 
00762   /////////////////////////////////////////
00763   // Bandwidth Savings Transaction Stats //
00764   /////////////////////////////////////////
00765 
00766   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00767                      "proxy.process.http.tcp_hit_count_stat",
00768                      RECD_COUNTER, RECP_PERSISTENT, (int) http_tcp_hit_count_stat, RecRawStatSyncCount);
00769 
00770   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00771                      "proxy.process.http.tcp_hit_user_agent_bytes_stat",
00772                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_hit_user_agent_bytes_stat, RecRawStatSyncSum);
00773 
00774   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00775                      "proxy.process.http.tcp_hit_origin_server_bytes_stat",
00776                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_hit_origin_server_bytes_stat, RecRawStatSyncSum);
00777 
00778   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00779                      "proxy.process.http.tcp_miss_count_stat",
00780                      RECD_COUNTER, RECP_PERSISTENT, (int) http_tcp_miss_count_stat, RecRawStatSyncCount);
00781 
00782   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00783                      "proxy.process.http.tcp_miss_user_agent_bytes_stat",
00784                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_miss_user_agent_bytes_stat, RecRawStatSyncSum);
00785 
00786   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00787                      "proxy.process.http.tcp_miss_origin_server_bytes_stat",
00788                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_miss_origin_server_bytes_stat, RecRawStatSyncSum);
00789 
00790   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00791                      "proxy.process.http.tcp_expired_miss_count_stat",
00792                      RECD_COUNTER, RECP_PERSISTENT, (int) http_tcp_expired_miss_count_stat, RecRawStatSyncCount);
00793 
00794   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00795                      "proxy.process.http.tcp_expired_miss_user_agent_bytes_stat",
00796                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_expired_miss_user_agent_bytes_stat, RecRawStatSyncSum);
00797 
00798   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00799                      "proxy.process.http.tcp_expired_miss_origin_server_bytes_stat",
00800                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_expired_miss_origin_server_bytes_stat, RecRawStatSyncSum);
00801 
00802   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00803                      "proxy.process.http.tcp_refresh_hit_count_stat",
00804                      RECD_COUNTER, RECP_PERSISTENT, (int) http_tcp_refresh_hit_count_stat, RecRawStatSyncCount);
00805 
00806   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00807                      "proxy.process.http.tcp_refresh_hit_user_agent_bytes_stat",
00808                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_refresh_hit_user_agent_bytes_stat, RecRawStatSyncSum);
00809 
00810   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00811                      "proxy.process.http.tcp_refresh_hit_origin_server_bytes_stat",
00812                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_refresh_hit_origin_server_bytes_stat, RecRawStatSyncSum);
00813 
00814   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00815                      "proxy.process.http.tcp_refresh_miss_count_stat",
00816                      RECD_COUNTER, RECP_PERSISTENT, (int) http_tcp_refresh_miss_count_stat, RecRawStatSyncCount);
00817 
00818   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00819                      "proxy.process.http.tcp_refresh_miss_user_agent_bytes_stat",
00820                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_refresh_miss_user_agent_bytes_stat, RecRawStatSyncSum);
00821 
00822   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00823                      "proxy.process.http.tcp_refresh_miss_origin_server_bytes_stat",
00824                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_refresh_miss_origin_server_bytes_stat, RecRawStatSyncSum);
00825 
00826   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00827                      "proxy.process.http.tcp_client_refresh_count_stat",
00828                      RECD_COUNTER, RECP_PERSISTENT, (int) http_tcp_client_refresh_count_stat, RecRawStatSyncCount);
00829 
00830   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00831                      "proxy.process.http.tcp_client_refresh_user_agent_bytes_stat",
00832                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_client_refresh_user_agent_bytes_stat, RecRawStatSyncSum);
00833 
00834   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00835                      "proxy.process.http.tcp_client_refresh_origin_server_bytes_stat",
00836                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_client_refresh_origin_server_bytes_stat, RecRawStatSyncSum);
00837 
00838   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00839                      "proxy.process.http.tcp_ims_hit_count_stat",
00840                      RECD_COUNTER, RECP_PERSISTENT, (int) http_tcp_ims_hit_count_stat, RecRawStatSyncCount);
00841 
00842   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00843                      "proxy.process.http.tcp_ims_hit_user_agent_bytes_stat",
00844                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_ims_hit_user_agent_bytes_stat, RecRawStatSyncSum);
00845 
00846   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00847                      "proxy.process.http.tcp_ims_hit_origin_server_bytes_stat",
00848                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_ims_hit_origin_server_bytes_stat, RecRawStatSyncSum);
00849 
00850   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00851                      "proxy.process.http.tcp_ims_miss_count_stat",
00852                      RECD_COUNTER, RECP_PERSISTENT, (int) http_tcp_ims_miss_count_stat, RecRawStatSyncCount);
00853 
00854   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00855                      "proxy.process.http.tcp_ims_miss_user_agent_bytes_stat",
00856                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_ims_miss_user_agent_bytes_stat, RecRawStatSyncSum);
00857 
00858   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00859                      "proxy.process.http.tcp_ims_miss_origin_server_bytes_stat",
00860                      RECD_INT, RECP_PERSISTENT, (int) http_tcp_ims_miss_origin_server_bytes_stat, RecRawStatSyncSum);
00861 
00862   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00863                      "proxy.process.http.err_client_abort_count_stat",
00864                      RECD_COUNTER, RECP_PERSISTENT, (int) http_err_client_abort_count_stat, RecRawStatSyncCount);
00865 
00866   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00867                      "proxy.process.http.err_client_abort_user_agent_bytes_stat",
00868                      RECD_INT, RECP_PERSISTENT, (int) http_err_client_abort_user_agent_bytes_stat, RecRawStatSyncSum);
00869 
00870   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00871                      "proxy.process.http.err_client_abort_origin_server_bytes_stat",
00872                      RECD_INT, RECP_PERSISTENT, (int) http_err_client_abort_origin_server_bytes_stat, RecRawStatSyncSum);
00873 
00874   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00875                      "proxy.process.http.err_connect_fail_count_stat",
00876                      RECD_COUNTER, RECP_PERSISTENT, (int) http_err_connect_fail_count_stat, RecRawStatSyncCount);
00877 
00878   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00879                      "proxy.process.http.err_connect_fail_user_agent_bytes_stat",
00880                      RECD_INT, RECP_PERSISTENT, (int) http_err_connect_fail_user_agent_bytes_stat, RecRawStatSyncSum);
00881 
00882   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00883                      "proxy.process.http.err_connect_fail_origin_server_bytes_stat",
00884                      RECD_INT, RECP_PERSISTENT, (int) http_err_connect_fail_origin_server_bytes_stat, RecRawStatSyncSum);
00885 
00886   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00887                      "proxy.process.http.misc_count_stat",
00888                      RECD_COUNTER, RECP_PERSISTENT, (int) http_misc_count_stat, RecRawStatSyncCount);
00889 
00890   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00891                      "proxy.process.http.misc_user_agent_bytes_stat",
00892                      RECD_INT, RECP_PERSISTENT, (int) http_misc_user_agent_bytes_stat, RecRawStatSyncSum);
00893 
00894   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00895                      "proxy.process.http.background_fill_bytes_aborted_stat",
00896                      RECD_INT, RECP_PERSISTENT, (int) http_background_fill_bytes_aborted_stat, RecRawStatSyncSum);
00897 
00898   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00899                      "proxy.process.http.background_fill_bytes_completed_stat",
00900                      RECD_INT, RECP_PERSISTENT, (int) http_background_fill_bytes_completed_stat, RecRawStatSyncSum);
00901 
00902   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00903                      "proxy.process.http.cache_write_errors",
00904                      RECD_INT, RECP_PERSISTENT, (int) http_cache_write_errors, RecRawStatSyncSum);
00905 
00906   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00907                      "proxy.process.http.cache_read_errors",
00908                      RECD_INT, RECP_PERSISTENT, (int) http_cache_read_errors, RecRawStatSyncSum);
00909 
00910   ////////////////////////////////////////////////////////////////////////////////
00911   // status code counts
00912   ////////////////////////////////////////////////////////////////////////////////
00913 
00914   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00915                      "proxy.process.http.100_responses",
00916                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_100_count_stat, RecRawStatSyncCount);
00917 
00918   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00919                      "proxy.process.http.101_responses",
00920                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_101_count_stat, RecRawStatSyncCount);
00921 
00922   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00923                      "proxy.process.http.1xx_responses",
00924                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_1xx_count_stat, RecRawStatSyncCount);
00925 
00926   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00927                      "proxy.process.http.200_responses",
00928                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_200_count_stat, RecRawStatSyncCount);
00929 
00930   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00931                      "proxy.process.http.201_responses",
00932                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_201_count_stat, RecRawStatSyncCount);
00933 
00934   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00935                      "proxy.process.http.202_responses",
00936                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_202_count_stat, RecRawStatSyncCount);
00937 
00938   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00939                      "proxy.process.http.203_responses",
00940                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_203_count_stat, RecRawStatSyncCount);
00941 
00942   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00943                      "proxy.process.http.204_responses",
00944                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_204_count_stat, RecRawStatSyncCount);
00945 
00946   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00947                      "proxy.process.http.205_responses",
00948                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_205_count_stat, RecRawStatSyncCount);
00949 
00950   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00951                      "proxy.process.http.206_responses",
00952                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_206_count_stat, RecRawStatSyncCount);
00953 
00954   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00955                      "proxy.process.http.2xx_responses",
00956                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_2xx_count_stat, RecRawStatSyncCount);
00957 
00958   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00959                      "proxy.process.http.300_responses",
00960                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_300_count_stat, RecRawStatSyncCount);
00961 
00962   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00963                      "proxy.process.http.301_responses",
00964                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_301_count_stat, RecRawStatSyncCount);
00965 
00966   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00967                      "proxy.process.http.302_responses",
00968                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_302_count_stat, RecRawStatSyncCount);
00969 
00970   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00971                      "proxy.process.http.303_responses",
00972                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_303_count_stat, RecRawStatSyncCount);
00973 
00974   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00975                      "proxy.process.http.304_responses",
00976                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_304_count_stat, RecRawStatSyncCount);
00977 
00978   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00979                      "proxy.process.http.305_responses",
00980                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_305_count_stat, RecRawStatSyncCount);
00981 
00982   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00983                      "proxy.process.http.307_responses",
00984                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_307_count_stat, RecRawStatSyncCount);
00985 
00986   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00987                      "proxy.process.http.3xx_responses",
00988                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_3xx_count_stat, RecRawStatSyncCount);
00989 
00990   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00991                      "proxy.process.http.400_responses",
00992                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_400_count_stat, RecRawStatSyncCount);
00993 
00994   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00995                      "proxy.process.http.401_responses",
00996                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_401_count_stat, RecRawStatSyncCount);
00997 
00998   RecRegisterRawStat(http_rsb, RECT_PROCESS,
00999                      "proxy.process.http.402_responses",
01000                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_402_count_stat, RecRawStatSyncCount);
01001 
01002   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01003                      "proxy.process.http.403_responses",
01004                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_403_count_stat, RecRawStatSyncCount);
01005 
01006   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01007                      "proxy.process.http.404_responses",
01008                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_404_count_stat, RecRawStatSyncCount);
01009 
01010   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01011                      "proxy.process.http.405_responses",
01012                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_405_count_stat, RecRawStatSyncCount);
01013 
01014   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01015                      "proxy.process.http.406_responses",
01016                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_406_count_stat, RecRawStatSyncCount);
01017 
01018   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01019                      "proxy.process.http.407_responses",
01020                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_407_count_stat, RecRawStatSyncCount);
01021 
01022   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01023                      "proxy.process.http.408_responses",
01024                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_408_count_stat, RecRawStatSyncCount);
01025 
01026   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01027                      "proxy.process.http.409_responses",
01028                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_409_count_stat, RecRawStatSyncCount);
01029 
01030   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01031                      "proxy.process.http.410_responses",
01032                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_410_count_stat, RecRawStatSyncCount);
01033 
01034   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01035                      "proxy.process.http.411_responses",
01036                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_411_count_stat, RecRawStatSyncCount);
01037 
01038   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01039                      "proxy.process.http.412_responses",
01040                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_412_count_stat, RecRawStatSyncCount);
01041 
01042   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01043                      "proxy.process.http.413_responses",
01044                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_413_count_stat, RecRawStatSyncCount);
01045 
01046   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01047                      "proxy.process.http.414_responses",
01048                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_414_count_stat, RecRawStatSyncCount);
01049 
01050   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01051                      "proxy.process.http.415_responses",
01052                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_415_count_stat, RecRawStatSyncCount);
01053 
01054   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01055                      "proxy.process.http.416_responses",
01056                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_416_count_stat, RecRawStatSyncCount);
01057 
01058   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01059                      "proxy.process.http.4xx_responses",
01060                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_4xx_count_stat, RecRawStatSyncCount);
01061 
01062   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01063                      "proxy.process.http.500_responses",
01064                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_500_count_stat, RecRawStatSyncCount);
01065 
01066   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01067                      "proxy.process.http.501_responses",
01068                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_501_count_stat, RecRawStatSyncCount);
01069 
01070   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01071                      "proxy.process.http.502_responses",
01072                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_502_count_stat, RecRawStatSyncCount);
01073 
01074   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01075                      "proxy.process.http.503_responses",
01076                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_503_count_stat, RecRawStatSyncCount);
01077 
01078   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01079                      "proxy.process.http.504_responses",
01080                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_504_count_stat, RecRawStatSyncCount);
01081 
01082   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01083                      "proxy.process.http.505_responses",
01084                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_505_count_stat, RecRawStatSyncCount);
01085 
01086   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01087                      "proxy.process.http.5xx_responses",
01088                      RECD_COUNTER, RECP_PERSISTENT, (int) http_response_status_5xx_count_stat, RecRawStatSyncCount);
01089 
01090 
01091   ////////////////////////////////////////////////////////////////////////////////
01092   // http - time and count of transactions classified by client's point of view //
01093   //  the internal stat is in msecs, the output time is float seconds           //
01094   ////////////////////////////////////////////////////////////////////////////////
01095 
01096   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01097                      "proxy.process.http.transaction_counts.hit_fresh",
01098                      RECD_COUNTER, RECP_PERSISTENT, (int) http_ua_msecs_counts_hit_fresh_stat, RecRawStatSyncCount);
01099   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01100                      "proxy.process.http.transaction_totaltime.hit_fresh",
01101                      RECD_FLOAT, RECP_PERSISTENT,
01102                      (int) http_ua_msecs_counts_hit_fresh_stat, RecRawStatSyncIntMsecsToFloatSeconds);
01103 
01104   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01105                      "proxy.process.http.transaction_counts.hit_fresh.process",
01106                      RECD_COUNTER, RECP_PERSISTENT, (int) http_ua_msecs_counts_hit_fresh_process_stat, RecRawStatSyncCount);
01107   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01108                      "proxy.process.http.transaction_totaltime.hit_fresh.process",
01109                      RECD_FLOAT, RECP_PERSISTENT,
01110                      (int) http_ua_msecs_counts_hit_fresh_process_stat, RecRawStatSyncIntMsecsToFloatSeconds);
01111 
01112   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01113                      "proxy.process.http.transaction_counts.hit_revalidated",
01114                      RECD_COUNTER, RECP_PERSISTENT, (int) http_ua_msecs_counts_hit_reval_stat, RecRawStatSyncCount);
01115   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01116                      "proxy.process.http.transaction_totaltime.hit_revalidated",
01117                      RECD_FLOAT, RECP_PERSISTENT,
01118                      (int) http_ua_msecs_counts_hit_reval_stat, RecRawStatSyncIntMsecsToFloatSeconds);
01119 
01120   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01121                      "proxy.process.http.transaction_counts.miss_cold",
01122                      RECD_COUNTER, RECP_PERSISTENT, (int) http_ua_msecs_counts_miss_cold_stat, RecRawStatSyncCount);
01123   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01124                      "proxy.process.http.transaction_totaltime.miss_cold",
01125                      RECD_FLOAT, RECP_PERSISTENT,
01126                      (int) http_ua_msecs_counts_miss_cold_stat, RecRawStatSyncIntMsecsToFloatSeconds);
01127 
01128   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01129                      "proxy.process.http.transaction_counts.miss_not_cacheable",
01130                      RECD_COUNTER, RECP_PERSISTENT, (int) http_ua_msecs_counts_miss_uncacheable_stat, RecRawStatSyncCount);
01131   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01132                      "proxy.process.http.transaction_totaltime.miss_not_cacheable",
01133                      RECD_FLOAT, RECP_PERSISTENT,
01134                      (int) http_ua_msecs_counts_miss_uncacheable_stat, RecRawStatSyncIntMsecsToFloatSeconds);
01135 
01136   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01137                      "proxy.process.http.transaction_counts.miss_changed",
01138                      RECD_COUNTER, RECP_PERSISTENT, (int) http_ua_msecs_counts_miss_changed_stat, RecRawStatSyncCount);
01139   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01140                      "proxy.process.http.transaction_totaltime.miss_changed",
01141                      RECD_FLOAT, RECP_PERSISTENT,
01142                      (int) http_ua_msecs_counts_miss_changed_stat, RecRawStatSyncIntMsecsToFloatSeconds);
01143 
01144 
01145   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01146                      "proxy.process.http.transaction_counts.miss_client_no_cache",
01147                      RECD_COUNTER, RECP_PERSISTENT,
01148                      (int) http_ua_msecs_counts_miss_client_no_cache_stat, RecRawStatSyncCount);
01149   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01150                      "proxy.process.http.transaction_totaltime.miss_client_no_cache",
01151                      RECD_FLOAT, RECP_PERSISTENT,
01152                      (int) http_ua_msecs_counts_miss_client_no_cache_stat, RecRawStatSyncIntMsecsToFloatSeconds);
01153 
01154   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01155                      "proxy.process.http.transaction_counts.errors.aborts",
01156                      RECD_COUNTER, RECP_PERSISTENT, (int) http_ua_msecs_counts_errors_aborts_stat, RecRawStatSyncCount);
01157   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01158                      "proxy.process.http.transaction_totaltime.errors.aborts",
01159                      RECD_FLOAT, RECP_PERSISTENT,
01160                      (int) http_ua_msecs_counts_errors_aborts_stat, RecRawStatSyncIntMsecsToFloatSeconds);
01161 
01162   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01163                      "proxy.process.http.transaction_counts.errors.possible_aborts",
01164                      RECD_COUNTER, RECP_PERSISTENT,
01165                      (int) http_ua_msecs_counts_errors_possible_aborts_stat, RecRawStatSyncCount);
01166   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01167                      "proxy.process.http.transaction_totaltime.errors.possible_aborts",
01168                      RECD_FLOAT, RECP_PERSISTENT,
01169                      (int) http_ua_msecs_counts_errors_possible_aborts_stat, RecRawStatSyncIntMsecsToFloatSeconds);
01170 
01171   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01172                      "proxy.process.http.transaction_counts.errors.connect_failed",
01173                      RECD_COUNTER, RECP_PERSISTENT,
01174                      (int) http_ua_msecs_counts_errors_connect_failed_stat, RecRawStatSyncCount);
01175   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01176                      "proxy.process.http.transaction_totaltime.errors.connect_failed",
01177                      RECD_FLOAT, RECP_PERSISTENT,
01178                      (int) http_ua_msecs_counts_errors_connect_failed_stat, RecRawStatSyncIntMsecsToFloatSeconds);
01179 
01180   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01181                      "proxy.process.http.transaction_counts.errors.other",
01182                      RECD_COUNTER, RECP_PERSISTENT, (int) http_ua_msecs_counts_errors_other_stat, RecRawStatSyncCount);
01183   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01184                      "proxy.process.http.transaction_totaltime.errors.other",
01185                      RECD_FLOAT, RECP_PERSISTENT,
01186                      (int) http_ua_msecs_counts_errors_other_stat, RecRawStatSyncIntMsecsToFloatSeconds);
01187 
01188   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01189                      "proxy.process.http.transaction_counts.other.unclassified",
01190                      RECD_COUNTER, RECP_PERSISTENT, (int) http_ua_msecs_counts_other_unclassified_stat, RecRawStatSyncCount);
01191   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01192                      "proxy.process.http.transaction_totaltime.other.unclassified",
01193                      RECD_FLOAT, RECP_PERSISTENT,
01194                      (int) http_ua_msecs_counts_other_unclassified_stat, RecRawStatSyncIntMsecsToFloatSeconds);
01195 
01196   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01197                      "proxy.process.http.total_x_redirect_count",
01198                      RECD_COUNTER, RECP_PERSISTENT,
01199                      (int) http_total_x_redirect_stat, RecRawStatSyncCount);
01200 
01201   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01202                      "proxy.process.https.incoming_requests",
01203                      RECD_COUNTER, RECP_PERSISTENT, (int) https_incoming_requests_stat, RecRawStatSyncCount);
01204   RecRegisterRawStat(http_rsb, RECT_PROCESS,
01205                      "proxy.process.https.total_client_connections",
01206                      RECD_COUNTER, RECP_PERSISTENT, (int) https_total_client_connections_stat, RecRawStatSyncCount);
01207 }
01208 
01209 
01210 ////////////////////////////////////////////////////////////////
01211 //
01212 //  HttpConfig::startup()
01213 //
01214 ////////////////////////////////////////////////////////////////
01215 void
01216 HttpConfig::startup()
01217 {
01218 
01219   http_rsb = RecAllocateRawStatBlock((int) http_stat_count);
01220   register_configs();
01221   register_stat_callbacks();
01222 
01223   HttpConfigParams &c = m_master;
01224 
01225   http_config_cont = new HttpConfigCont;
01226 
01227   HttpEstablishStaticConfigStringAlloc(c.proxy_hostname, "proxy.config.proxy_name");
01228   c.proxy_hostname_len = -1;
01229 
01230   if (c.proxy_hostname == NULL) {
01231     c.proxy_hostname = (char *)ats_malloc(sizeof(char));
01232     c.proxy_hostname[0] = '\0';
01233   }
01234 
01235   RecHttpLoadIp("proxy.local.incoming_ip_to_bind", c.inbound_ip4, c.inbound_ip6);
01236   RecHttpLoadIp("proxy.local.outgoing_ip_to_bind", c.outbound_ip4, c.outbound_ip6);
01237 
01238 #if TS_USE_RECLAIMABLE_FREELIST
01239   HttpEstablishStaticConfigLongLong(cfg_debug_filter, "proxy.config.allocator.debug_filter");
01240   HttpEstablishStaticConfigLongLong(cfg_enable_reclaim, "proxy.config.allocator.enable_reclaim");
01241   HttpEstablishStaticConfigLongLong(cfg_max_overage, "proxy.config.allocator.max_overage");
01242   HttpEstablishStaticConfigFloat(cfg_reclaim_factor, "proxy.config.allocator.reclaim_factor");
01243 #endif
01244 
01245   HttpEstablishStaticConfigLongLong(c.server_max_connections, "proxy.config.http.server_max_connections");
01246   HttpEstablishStaticConfigLongLong(c.oride.server_tcp_init_cwnd, "proxy.config.http.server_tcp_init_cwnd");
01247   HttpEstablishStaticConfigLongLong(c.oride.origin_max_connections, "proxy.config.http.origin_max_connections");
01248   HttpEstablishStaticConfigLongLong(c.origin_min_keep_alive_connections, "proxy.config.http.origin_min_keep_alive_connections");
01249   HttpEstablishStaticConfigLongLong(c.attach_server_session_to_client, "proxy.config.http.attach_server_session_to_client");
01250 
01251   HttpEstablishStaticConfigByte(c.parent_proxy_routing_enable, "proxy.config.http.parent_proxy_routing_enable");
01252 
01253   // Wank me.
01254   HttpEstablishStaticConfigByte(c.disable_ssl_parenting, "proxy.local.http.parent_proxy.disable_connect_tunneling");
01255   HttpEstablishStaticConfigByte(c.no_dns_forward_to_parent, "proxy.config.http.no_dns_just_forward_to_parent");
01256   HttpEstablishStaticConfigByte(c.uncacheable_requests_bypass_parent, "proxy.config.http.uncacheable_requests_bypass_parent");
01257   HttpEstablishStaticConfigByte(c.oride.doc_in_cache_skip_dns, "proxy.config.http.doc_in_cache_skip_dns");
01258 
01259   HttpEstablishStaticConfigByte(c.no_origin_server_dns, "proxy.config.http.no_origin_server_dns");
01260   HttpEstablishStaticConfigByte(c.use_client_target_addr, "proxy.config.http.use_client_target_addr");
01261   HttpEstablishStaticConfigByte(c.use_client_source_port, "proxy.config.http.use_client_source_port");
01262   HttpEstablishStaticConfigByte(c.oride.maintain_pristine_host_hdr, "proxy.config.url_remap.pristine_host_hdr");
01263 
01264   HttpEstablishStaticConfigByte(c.enable_url_expandomatic, "proxy.config.http.enable_url_expandomatic");
01265 
01266   HttpEstablishStaticConfigByte(c.oride.insert_request_via_string, "proxy.config.http.insert_request_via_str");
01267   HttpEstablishStaticConfigByte(c.oride.insert_response_via_string, "proxy.config.http.insert_response_via_str");
01268   HttpEstablishStaticConfigLongLong(c.oride.proxy_response_hsts_max_age, "proxy.config.ssl.hsts_max_age");
01269   HttpEstablishStaticConfigByte(c.oride.proxy_response_hsts_include_subdomains, "proxy.config.ssl.hsts_include_subdomains");
01270 
01271   HttpEstablishStaticConfigStringAlloc(c.proxy_request_via_string, "proxy.config.http.request_via_str");
01272   c.proxy_request_via_string_len = -1;
01273   HttpEstablishStaticConfigStringAlloc(c.proxy_response_via_string, "proxy.config.http.response_via_str");
01274   c.proxy_response_via_string_len = -1;
01275 
01276   HttpEstablishStaticConfigStringAlloc(c.url_expansions_string, "proxy.config.dns.url_expansions");
01277   HttpEstablishStaticConfigByte(c.oride.keep_alive_enabled_in, "proxy.config.http.keep_alive_enabled_in");
01278   HttpEstablishStaticConfigByte(c.oride.keep_alive_enabled_out, "proxy.config.http.keep_alive_enabled_out");
01279   HttpEstablishStaticConfigByte(c.oride.chunking_enabled, "proxy.config.http.chunking_enabled");
01280   HttpEstablishStaticConfigLongLong(c.oride.http_chunking_size, "proxy.config.http.chunking.size");
01281   HttpEstablishStaticConfigByte(c.oride.flow_control_enabled, "proxy.config.http.flow_control.enabled");
01282   HttpEstablishStaticConfigLongLong(c.oride.flow_high_water_mark, "proxy.config.http.flow_control.high_water");
01283   HttpEstablishStaticConfigLongLong(c.oride.flow_low_water_mark, "proxy.config.http.flow_control.low_water");
01284   HttpEstablishStaticConfigByte(c.oride.post_check_content_length_enabled, "proxy.config.http.post.check.content_length.enabled");
01285 //HttpEstablishStaticConfigByte(c.oride.share_server_sessions, "proxy.config.http.share_server_sessions");
01286 
01287   // 4.2 Backwards compatibility
01288   RecRegisterConfigUpdateCb("proxy.config.http.share_server_sessions", &http_server_session_sharing_cb, &c);
01289   http_config_share_server_sessions_read_bc(&c);
01290   // end 4.2 BC
01291 
01292   // [amc] This is a bit of a mess, need to figure out to make this cleaner.
01293   RecRegisterConfigUpdateCb("proxy.config.http.server_session_sharing.pool", &http_server_session_sharing_cb, &c);
01294   http_config_enum_read("proxy.config.http.server_session_sharing.pool", SessionSharingPoolStrings, ARRAY_SIZE(SessionSharingPoolStrings), c.oride.server_session_sharing_pool);
01295   RecRegisterConfigUpdateCb("proxy.config.http.server_session_sharing.match", &http_server_session_sharing_cb, &c);
01296   http_config_enum_read("proxy.config.http.server_session_sharing.match", SessionSharingMatchStrings, ARRAY_SIZE(SessionSharingMatchStrings), c.oride.server_session_sharing_match);
01297 
01298   HttpEstablishStaticConfigByte(c.oride.keep_alive_post_out, "proxy.config.http.keep_alive_post_out");
01299 
01300   HttpEstablishStaticConfigLongLong(c.oride.keep_alive_no_activity_timeout_in,
01301                                     "proxy.config.http.keep_alive_no_activity_timeout_in");
01302   HttpEstablishStaticConfigLongLong(c.oride.keep_alive_no_activity_timeout_out,
01303                                     "proxy.config.http.keep_alive_no_activity_timeout_out");
01304   HttpEstablishStaticConfigLongLong(c.oride.transaction_no_activity_timeout_in,
01305                                     "proxy.config.http.transaction_no_activity_timeout_in");
01306   HttpEstablishStaticConfigLongLong(c.oride.transaction_no_activity_timeout_out,
01307                                     "proxy.config.http.transaction_no_activity_timeout_out");
01308   HttpEstablishStaticConfigLongLong(c.transaction_active_timeout_in, "proxy.config.http.transaction_active_timeout_in");
01309   HttpEstablishStaticConfigLongLong(c.oride.transaction_active_timeout_out, "proxy.config.http.transaction_active_timeout_out");
01310   HttpEstablishStaticConfigLongLong(c.accept_no_activity_timeout, "proxy.config.http.accept_no_activity_timeout");
01311 
01312   HttpEstablishStaticConfigLongLong(c.oride.background_fill_active_timeout, "proxy.config.http.background_fill_active_timeout");
01313   HttpEstablishStaticConfigFloat(c.oride.background_fill_threshold, "proxy.config.http.background_fill_completed_threshold");
01314 
01315   HttpEstablishStaticConfigLongLong(c.oride.connect_attempts_max_retries, "proxy.config.http.connect_attempts_max_retries");
01316   HttpEstablishStaticConfigLongLong(c.oride.connect_attempts_max_retries_dead_server,
01317                                     "proxy.config.http.connect_attempts_max_retries_dead_server");
01318 
01319   HttpEstablishStaticConfigLongLong(c.oride.connect_attempts_rr_retries, "proxy.config.http.connect_attempts_rr_retries");
01320   HttpEstablishStaticConfigLongLong(c.oride.connect_attempts_timeout, "proxy.config.http.connect_attempts_timeout");
01321   HttpEstablishStaticConfigLongLong(c.oride.post_connect_attempts_timeout, "proxy.config.http.post_connect_attempts_timeout");
01322   HttpEstablishStaticConfigLongLong(c.parent_connect_attempts, "proxy.config.http.parent_proxy.total_connect_attempts");
01323   HttpEstablishStaticConfigLongLong(c.per_parent_connect_attempts, "proxy.config.http.parent_proxy.per_parent_connect_attempts");
01324   HttpEstablishStaticConfigLongLong(c.parent_connect_timeout, "proxy.config.http.parent_proxy.connect_attempts_timeout");
01325 
01326   HttpEstablishStaticConfigLongLong(c.oride.sock_recv_buffer_size_out, "proxy.config.net.sock_recv_buffer_size_out");
01327   HttpEstablishStaticConfigLongLong(c.oride.sock_send_buffer_size_out, "proxy.config.net.sock_send_buffer_size_out");
01328   HttpEstablishStaticConfigLongLong(c.oride.sock_option_flag_out, "proxy.config.net.sock_option_flag_out");
01329   HttpEstablishStaticConfigLongLong(c.oride.sock_packet_mark_out, "proxy.config.net.sock_packet_mark_out");
01330   HttpEstablishStaticConfigLongLong(c.oride.sock_packet_tos_out, "proxy.config.net.sock_packet_tos_out");
01331 
01332 
01333   HttpEstablishStaticConfigByte(c.oride.fwd_proxy_auth_to_parent, "proxy.config.http.forward.proxy_auth_to_parent");
01334 
01335   HttpEstablishStaticConfigByte(c.oride.anonymize_remove_from, "proxy.config.http.anonymize_remove_from");
01336   HttpEstablishStaticConfigByte(c.oride.anonymize_remove_referer, "proxy.config.http.anonymize_remove_referer");
01337   HttpEstablishStaticConfigByte(c.oride.anonymize_remove_user_agent, "proxy.config.http.anonymize_remove_user_agent");
01338   HttpEstablishStaticConfigByte(c.oride.anonymize_remove_cookie, "proxy.config.http.anonymize_remove_cookie");
01339   HttpEstablishStaticConfigByte(c.oride.anonymize_remove_client_ip, "proxy.config.http.anonymize_remove_client_ip");
01340   HttpEstablishStaticConfigByte(c.oride.anonymize_insert_client_ip, "proxy.config.http.anonymize_insert_client_ip");
01341   HttpEstablishStaticConfigStringAlloc(c.anonymize_other_header_list, "proxy.config.http.anonymize_other_header_list");
01342 
01343   HttpEstablishStaticConfigStringAlloc(c.oride.global_user_agent_header, "proxy.config.http.global_user_agent_header");
01344   c.oride.global_user_agent_header_size = c.oride.global_user_agent_header ?
01345     strlen(c.oride.global_user_agent_header) : 0;
01346 
01347   HttpEstablishStaticConfigByte(c.oride.proxy_response_server_enabled, "proxy.config.http.response_server_enabled");
01348   HttpEstablishStaticConfigStringAlloc(c.oride.proxy_response_server_string, "proxy.config.http.response_server_str");
01349   c.oride.proxy_response_server_string_len = c.oride.proxy_response_server_string ?
01350     strlen(c.oride.proxy_response_server_string) : 0;
01351 
01352   HttpEstablishStaticConfigByte(c.oride.insert_squid_x_forwarded_for, "proxy.config.http.insert_squid_x_forwarded_for");
01353 
01354 
01355   HttpEstablishStaticConfigByte(c.oride.insert_age_in_response, "proxy.config.http.insert_age_in_response");
01356   HttpEstablishStaticConfigByte(c.enable_http_stats, "proxy.config.http.enable_http_stats");
01357   HttpEstablishStaticConfigByte(c.oride.normalize_ae_gzip, "proxy.config.http.normalize_ae_gzip");
01358 
01359   HttpEstablishStaticConfigByte(c.icp_enabled, "proxy.config.icp.enabled");
01360   HttpEstablishStaticConfigByte(c.stale_icp_enabled, "proxy.config.icp.stale_icp_enabled");
01361 
01362   HttpEstablishStaticConfigLongLong(c.oride.cache_heuristic_min_lifetime, "proxy.config.http.cache.heuristic_min_lifetime");
01363   HttpEstablishStaticConfigLongLong(c.oride.cache_heuristic_max_lifetime, "proxy.config.http.cache.heuristic_max_lifetime");
01364   HttpEstablishStaticConfigFloat(c.oride.cache_heuristic_lm_factor, "proxy.config.http.cache.heuristic_lm_factor");
01365 
01366   HttpEstablishStaticConfigLongLong(c.oride.cache_guaranteed_min_lifetime, "proxy.config.http.cache.guaranteed_min_lifetime");
01367   HttpEstablishStaticConfigLongLong(c.oride.cache_guaranteed_max_lifetime, "proxy.config.http.cache.guaranteed_max_lifetime");
01368 
01369   HttpEstablishStaticConfigLongLong(c.oride.cache_max_stale_age, "proxy.config.http.cache.max_stale_age");
01370 
01371   HttpEstablishStaticConfigLongLong(c.oride.freshness_fuzz_time, "proxy.config.http.cache.fuzz.time");
01372   HttpEstablishStaticConfigLongLong(c.oride.freshness_fuzz_min_time, "proxy.config.http.cache.fuzz.min_time");
01373   HttpEstablishStaticConfigFloat(c.oride.freshness_fuzz_prob, "proxy.config.http.cache.fuzz.probability");
01374 
01375   HttpEstablishStaticConfigStringAlloc(c.cache_vary_default_text, "proxy.config.http.cache.vary_default_text");
01376   HttpEstablishStaticConfigStringAlloc(c.cache_vary_default_images, "proxy.config.http.cache.vary_default_images");
01377   HttpEstablishStaticConfigStringAlloc(c.cache_vary_default_other, "proxy.config.http.cache.vary_default_other");
01378 
01379   // open read failure retries
01380   HttpEstablishStaticConfigLongLong(c.oride.max_cache_open_read_retries, "proxy.config.http.cache.max_open_read_retries");
01381   HttpEstablishStaticConfigLongLong(c.oride.cache_open_read_retry_time, "proxy.config.http.cache.open_read_retry_time");
01382 
01383   // open write failure retries
01384   HttpEstablishStaticConfigLongLong(c.max_cache_open_write_retries, "proxy.config.http.cache.max_open_write_retries");
01385 
01386   HttpEstablishStaticConfigByte(c.oride.cache_http, "proxy.config.http.cache.http");
01387   HttpEstablishStaticConfigByte(c.oride.cache_cluster_cache_local, "proxy.config.http.cache.cluster_cache_local");
01388   HttpEstablishStaticConfigByte(c.oride.cache_ignore_client_no_cache, "proxy.config.http.cache.ignore_client_no_cache");
01389   HttpEstablishStaticConfigByte(c.oride.cache_ignore_client_cc_max_age, "proxy.config.http.cache.ignore_client_cc_max_age");
01390   HttpEstablishStaticConfigByte(c.oride.cache_ims_on_client_no_cache, "proxy.config.http.cache.ims_on_client_no_cache");
01391   HttpEstablishStaticConfigByte(c.oride.cache_ignore_server_no_cache, "proxy.config.http.cache.ignore_server_no_cache");
01392   HttpEstablishStaticConfigByte(c.oride.cache_responses_to_cookies, "proxy.config.http.cache.cache_responses_to_cookies");
01393 
01394   HttpEstablishStaticConfigByte(c.oride.cache_ignore_auth, "proxy.config.http.cache.ignore_authentication");
01395   HttpEstablishStaticConfigByte(c.oride.cache_urls_that_look_dynamic, "proxy.config.http.cache.cache_urls_that_look_dynamic");
01396   HttpEstablishStaticConfigByte(c.cache_enable_default_vary_headers, "proxy.config.http.cache.enable_default_vary_headers");
01397   HttpEstablishStaticConfigByte(c.cache_post_method, "proxy.config.http.cache.post_method");
01398 
01399   HttpEstablishStaticConfigByte(c.ignore_accept_mismatch, "proxy.config.http.cache.ignore_accept_mismatch");
01400   HttpEstablishStaticConfigByte(c.ignore_accept_language_mismatch, "proxy.config.http.cache.ignore_accept_language_mismatch");
01401   HttpEstablishStaticConfigByte(c.ignore_accept_encoding_mismatch, "proxy.config.http.cache.ignore_accept_encoding_mismatch");
01402   HttpEstablishStaticConfigByte(c.ignore_accept_charset_mismatch, "proxy.config.http.cache.ignore_accept_charset_mismatch");
01403 
01404   HttpEstablishStaticConfigByte(c.send_100_continue_response, "proxy.config.http.send_100_continue_response");
01405 
01406   HttpEstablishStaticConfigByte(c.oride.cache_when_to_revalidate, "proxy.config.http.cache.when_to_revalidate");
01407   HttpEstablishStaticConfigByte(c.oride.cache_required_headers, "proxy.config.http.cache.required_headers");
01408   HttpEstablishStaticConfigByte(c.oride.cache_range_lookup, "proxy.config.http.cache.range.lookup");
01409   HttpEstablishStaticConfigByte(c.oride.cache_range_write, "proxy.config.http.cache.range.write");
01410 
01411   HttpEstablishStaticConfigStringAlloc(c.connect_ports_string, "proxy.config.http.connect_ports");
01412 
01413   HttpEstablishStaticConfigLongLong(c.oride.request_hdr_max_size, "proxy.config.http.request_header_max_size");
01414   HttpEstablishStaticConfigLongLong(c.oride.response_hdr_max_size, "proxy.config.http.response_header_max_size");
01415 
01416   HttpEstablishStaticConfigByte(c.push_method_enabled, "proxy.config.http.push_method_enabled");
01417 
01418   HttpEstablishStaticConfigByte(c.reverse_proxy_enabled, "proxy.config.reverse_proxy.enabled");
01419   HttpEstablishStaticConfigByte(c.url_remap_required, "proxy.config.url_remap.remap_required");
01420 
01421   HttpEstablishStaticConfigStringAlloc(c.reverse_proxy_no_host_redirect, "proxy.config.header.parse.no_host_url_redirect");
01422   c.reverse_proxy_no_host_redirect_len = -1;
01423 
01424   HttpEstablishStaticConfigByte(c.errors_log_error_pages, "proxy.config.http.errors.log_error_pages");
01425 
01426   HttpEstablishStaticConfigLongLong(c.slow_log_threshold, "proxy.config.http.slow.log.threshold");
01427 
01428   HttpEstablishStaticConfigByte(c.record_cop_page, "proxy.config.http.record_heartbeat");
01429 
01430   HttpEstablishStaticConfigByte(c.oride.send_http11_requests, "proxy.config.http.send_http11_requests");
01431 
01432   // HTTP Referer Filtering
01433   HttpEstablishStaticConfigByte(c.referer_filter_enabled, "proxy.config.http.referer_filter");
01434   HttpEstablishStaticConfigByte(c.referer_format_redirect, "proxy.config.http.referer_format_redirect");
01435 
01436   HttpEstablishStaticConfigLongLong(c.oride.down_server_timeout, "proxy.config.http.down_server.cache_time");
01437   HttpEstablishStaticConfigLongLong(c.oride.client_abort_threshold, "proxy.config.http.down_server.abort_threshold");
01438 
01439   // Negative caching and revalidation
01440   HttpEstablishStaticConfigByte(c.oride.negative_caching_enabled, "proxy.config.http.negative_caching_enabled");
01441   HttpEstablishStaticConfigLongLong(c.oride.negative_caching_lifetime, "proxy.config.http.negative_caching_lifetime");
01442   HttpEstablishStaticConfigByte(c.oride.negative_revalidating_enabled, "proxy.config.http.negative_revalidating_enabled");
01443   HttpEstablishStaticConfigLongLong(c.oride.negative_revalidating_lifetime,
01444                                     "proxy.config.http.negative_revalidating_lifetime");
01445 
01446   // Buffer size and watermark
01447   HttpEstablishStaticConfigLongLong(c.oride.default_buffer_size_index, "proxy.config.http.default_buffer_size");
01448   HttpEstablishStaticConfigLongLong(c.oride.default_buffer_water_mark, "proxy.config.http.default_buffer_water_mark");
01449 
01450   // Stat Page Info
01451   HttpEstablishStaticConfigByte(c.enable_http_info, "proxy.config.http.enable_http_info");
01452 
01453   //##############################################################################
01454   //#
01455   //# Redirection
01456   //#
01457   //# 1. redirection_enabled: if set to 1, redirection is enabled.
01458   //# 2. number_of_redirections: The maximum number of redirections YTS permits
01459   //# 3. post_copy_size: The maximum POST data size YTS permits to copy
01460   //# 4. redirection_host_no_port: do not include default port in host header during redirection
01461   //#
01462   //##############################################################################
01463   HttpEstablishStaticConfigByte(c.redirection_enabled, "proxy.config.http.redirection_enabled");
01464   HttpEstablishStaticConfigByte(c.redirection_host_no_port, "proxy.config.http.redirect_host_no_port");
01465   HttpEstablishStaticConfigLongLong(c.number_of_redirections, "proxy.config.http.number_of_redirections");
01466   HttpEstablishStaticConfigLongLong(c.post_copy_size, "proxy.config.http.post_copy_size");
01467 
01468   // Local Manager
01469   HttpEstablishStaticConfigLongLong(c.autoconf_port, "proxy.config.admin.autoconf_port");
01470   HttpEstablishStaticConfigByte(c.autoconf_localhost_only, "proxy.config.admin.autoconf.localhost_only");
01471 
01472   // Cluster time delta gets it own callback since it needs
01473   //  to use ink_atomic_swap
01474   c.cluster_time_delta = 0;
01475   RegisterMgmtCallback(MGMT_EVENT_HTTP_CLUSTER_DELTA, cluster_delta_cb, NULL);
01476 
01477   http_config_cont->handleEvent(EVENT_NONE, NULL);
01478 
01479   return;
01480 }
01481 
01482 ////////////////////////////////////////////////////////////////
01483 //
01484 //  HttpConfig::reconfigure()
01485 //
01486 ////////////////////////////////////////////////////////////////
01487 void
01488 HttpConfig::reconfigure()
01489 {
01490 #define INT_TO_BOOL(i) ((i) ? 1 : 0);
01491 
01492   HttpConfigParams *params;
01493 
01494   params = new HttpConfigParams;
01495 
01496   params->inbound_ip4 = m_master.inbound_ip4;
01497   params->inbound_ip6 = m_master.inbound_ip6;
01498 
01499   params->outbound_ip4 = m_master.outbound_ip4;
01500   params->outbound_ip6 = m_master.outbound_ip6;
01501 
01502   params->proxy_hostname = ats_strdup(m_master.proxy_hostname);
01503   params->proxy_hostname_len = (params->proxy_hostname) ? strlen(params->proxy_hostname) : 0;
01504   params->no_dns_forward_to_parent = INT_TO_BOOL(m_master.no_dns_forward_to_parent);
01505   params->uncacheable_requests_bypass_parent = INT_TO_BOOL(m_master.uncacheable_requests_bypass_parent);
01506   params->no_origin_server_dns = INT_TO_BOOL(m_master.no_origin_server_dns);
01507   params->use_client_target_addr = m_master.use_client_target_addr;
01508   params->use_client_source_port = INT_TO_BOOL(m_master.use_client_source_port);
01509   params->oride.maintain_pristine_host_hdr = INT_TO_BOOL(m_master.oride.maintain_pristine_host_hdr);
01510 
01511   params->disable_ssl_parenting = INT_TO_BOOL(m_master.disable_ssl_parenting);
01512 
01513   params->server_max_connections = m_master.server_max_connections;
01514   params->oride.server_tcp_init_cwnd = m_master.oride.server_tcp_init_cwnd;
01515   params->oride.origin_max_connections = m_master.oride.origin_max_connections;
01516   params->origin_min_keep_alive_connections = m_master.origin_min_keep_alive_connections;
01517   params->attach_server_session_to_client = m_master.attach_server_session_to_client;
01518 
01519   if (params->oride.origin_max_connections &&
01520       params->oride.origin_max_connections < params->origin_min_keep_alive_connections ) {
01521     Warning("origin_max_connections < origin_min_keep_alive_connections, setting min=max , please correct your records.config");
01522     params->origin_min_keep_alive_connections = params->oride.origin_max_connections;
01523   }
01524 
01525   params->parent_proxy_routing_enable = INT_TO_BOOL(m_master.parent_proxy_routing_enable);
01526   params->enable_url_expandomatic = INT_TO_BOOL(m_master.enable_url_expandomatic);
01527 
01528   params->oride.insert_request_via_string = m_master.oride.insert_request_via_string;
01529   params->oride.insert_response_via_string = m_master.oride.insert_response_via_string;
01530   params->proxy_request_via_string = ats_strdup(m_master.proxy_request_via_string);
01531   params->proxy_request_via_string_len = (params->proxy_request_via_string) ? strlen(params->proxy_request_via_string) : 0;
01532   params->proxy_response_via_string = ats_strdup(m_master.proxy_response_via_string);
01533   params->proxy_response_via_string_len = (params->proxy_response_via_string) ? strlen(params->proxy_response_via_string) : 0;
01534   params->oride.proxy_response_hsts_max_age = m_master.oride.proxy_response_hsts_max_age;
01535   params->oride.proxy_response_hsts_include_subdomains = m_master.oride.proxy_response_hsts_include_subdomains;
01536 
01537   params->url_expansions_string = ats_strdup(m_master.url_expansions_string);
01538   params->url_expansions = parse_url_expansions(params->url_expansions_string, &params->num_url_expansions);
01539 
01540   params->oride.keep_alive_enabled_in = INT_TO_BOOL(m_master.oride.keep_alive_enabled_in);
01541   params->oride.keep_alive_enabled_out = INT_TO_BOOL(m_master.oride.keep_alive_enabled_out);
01542   params->oride.chunking_enabled = INT_TO_BOOL(m_master.oride.chunking_enabled);
01543   params->oride.http_chunking_size = m_master.oride.http_chunking_size;
01544 
01545   params->oride.post_check_content_length_enabled = INT_TO_BOOL(m_master.oride.post_check_content_length_enabled);
01546 
01547   params->oride.flow_control_enabled = INT_TO_BOOL(m_master.oride.flow_control_enabled);
01548   params->oride.flow_high_water_mark = m_master.oride.flow_high_water_mark;
01549   params->oride.flow_low_water_mark = m_master.oride.flow_low_water_mark;
01550   // If not set (zero) then make values the same.
01551   if (params->oride.flow_low_water_mark <= 0)
01552     params->oride.flow_low_water_mark = params->oride.flow_high_water_mark;
01553   if (params->oride.flow_high_water_mark <= 0)
01554     params->oride.flow_high_water_mark = params->oride.flow_low_water_mark;
01555   if (params->oride.flow_high_water_mark < params->oride.flow_low_water_mark) {
01556     Warning("Flow control low water mark is greater than high water mark, flow control disabled");
01557     params->oride.flow_control_enabled = 0;
01558     // zero means "hardwired default" when actually used.
01559     params->oride.flow_high_water_mark = params->oride.flow_low_water_mark = 0;
01560   }
01561 
01562 //  params->oride.share_server_sessions = m_master.oride.share_server_sessions;
01563   params->oride.server_session_sharing_pool = m_master.oride.server_session_sharing_pool;
01564   params->oride.server_session_sharing_match = m_master.oride.server_session_sharing_match;
01565 
01566   params->oride.keep_alive_no_activity_timeout_in = m_master.oride.keep_alive_no_activity_timeout_in;
01567   params->oride.keep_alive_no_activity_timeout_out = m_master.oride.keep_alive_no_activity_timeout_out;
01568   params->oride.transaction_no_activity_timeout_in = m_master.oride.transaction_no_activity_timeout_in;
01569   params->oride.transaction_no_activity_timeout_out = m_master.oride.transaction_no_activity_timeout_out;
01570   params->transaction_active_timeout_in = m_master.transaction_active_timeout_in;
01571   params->oride.transaction_active_timeout_out = m_master.oride.transaction_active_timeout_out;
01572   params->accept_no_activity_timeout = m_master.accept_no_activity_timeout;
01573   params->oride.background_fill_active_timeout = m_master.oride.background_fill_active_timeout;
01574   params->oride.background_fill_threshold = m_master.oride.background_fill_threshold;
01575 
01576   params->oride.connect_attempts_max_retries = m_master.oride.connect_attempts_max_retries;
01577   params->oride.connect_attempts_max_retries_dead_server = m_master.oride.connect_attempts_max_retries_dead_server;
01578   params->oride.connect_attempts_rr_retries = m_master.oride.connect_attempts_rr_retries;
01579   params->oride.connect_attempts_timeout = m_master.oride.connect_attempts_timeout;
01580   params->oride.post_connect_attempts_timeout = m_master.oride.post_connect_attempts_timeout;
01581   params->parent_connect_attempts = m_master.parent_connect_attempts;
01582   params->per_parent_connect_attempts = m_master.per_parent_connect_attempts;
01583   params->parent_connect_timeout = m_master.parent_connect_timeout;
01584 
01585   params->oride.sock_recv_buffer_size_out = m_master.oride.sock_recv_buffer_size_out;
01586   params->oride.sock_send_buffer_size_out = m_master.oride.sock_send_buffer_size_out;
01587   params->oride.sock_option_flag_out = m_master.oride.sock_option_flag_out;
01588   params->oride.sock_packet_mark_out = m_master.oride.sock_packet_mark_out;
01589   params->oride.sock_packet_tos_out = m_master.oride.sock_packet_tos_out;
01590 
01591 
01592   params->oride.fwd_proxy_auth_to_parent = INT_TO_BOOL(m_master.oride.fwd_proxy_auth_to_parent);
01593 
01594   params->oride.anonymize_remove_from = INT_TO_BOOL(m_master.oride.anonymize_remove_from);
01595   params->oride.anonymize_remove_referer = INT_TO_BOOL(m_master.oride.anonymize_remove_referer);
01596   params->oride.anonymize_remove_user_agent = INT_TO_BOOL(m_master.oride.anonymize_remove_user_agent);
01597   params->oride.anonymize_remove_cookie = INT_TO_BOOL(m_master.oride.anonymize_remove_cookie);
01598   params->oride.anonymize_remove_client_ip = INT_TO_BOOL(m_master.oride.anonymize_remove_client_ip);
01599   params->oride.anonymize_insert_client_ip = INT_TO_BOOL(m_master.oride.anonymize_insert_client_ip);
01600   params->anonymize_other_header_list = ats_strdup(m_master.anonymize_other_header_list);
01601 
01602   params->oride.global_user_agent_header = ats_strdup(m_master.oride.global_user_agent_header);
01603   params->oride.global_user_agent_header_size = params->oride.global_user_agent_header ?
01604     strlen(params->oride.global_user_agent_header) : 0;
01605 
01606   params->oride.proxy_response_server_string = ats_strdup(m_master.oride.proxy_response_server_string);
01607   params->oride.proxy_response_server_string_len = params->oride.proxy_response_server_string ?
01608     strlen(params->oride.proxy_response_server_string) : 0;
01609   params->oride.proxy_response_server_enabled = m_master.oride.proxy_response_server_enabled;
01610 
01611   params->oride.insert_squid_x_forwarded_for = INT_TO_BOOL(m_master.oride.insert_squid_x_forwarded_for);
01612   params->oride.insert_age_in_response = INT_TO_BOOL(m_master.oride.insert_age_in_response);
01613   params->enable_http_stats = INT_TO_BOOL(m_master.enable_http_stats);
01614   params->oride.normalize_ae_gzip = INT_TO_BOOL(m_master.oride.normalize_ae_gzip);
01615 
01616   params->icp_enabled = (m_master.icp_enabled == ICP_MODE_SEND_RECEIVE ? 1 : 0); // INT_TO_BOOL
01617   params->stale_icp_enabled = INT_TO_BOOL(m_master.stale_icp_enabled);
01618 
01619   params->oride.cache_heuristic_min_lifetime = m_master.oride.cache_heuristic_min_lifetime;
01620   params->oride.cache_heuristic_max_lifetime = m_master.oride.cache_heuristic_max_lifetime;
01621   params->oride.cache_heuristic_lm_factor = min(max(m_master.oride.cache_heuristic_lm_factor, 0), 1);
01622 
01623   params->oride.cache_guaranteed_min_lifetime = m_master.oride.cache_guaranteed_min_lifetime;
01624   params->oride.cache_guaranteed_max_lifetime = m_master.oride.cache_guaranteed_max_lifetime;
01625 
01626   params->oride.cache_max_stale_age = m_master.oride.cache_max_stale_age;
01627   params->oride.freshness_fuzz_time = m_master.oride.freshness_fuzz_time;
01628   params->oride.freshness_fuzz_min_time = m_master.oride.freshness_fuzz_min_time;
01629   params->oride.freshness_fuzz_prob = m_master.oride.freshness_fuzz_prob;
01630 
01631   params->cache_vary_default_text = ats_strdup(m_master.cache_vary_default_text);
01632   params->cache_vary_default_images = ats_strdup(m_master.cache_vary_default_images);
01633   params->cache_vary_default_other = ats_strdup(m_master.cache_vary_default_other);
01634 
01635   // open read failure retries
01636   params->oride.max_cache_open_read_retries = m_master.oride.max_cache_open_read_retries;
01637   params->oride.cache_open_read_retry_time = m_master.oride.cache_open_read_retry_time;
01638 
01639   // open write failure retries
01640   params->max_cache_open_write_retries = m_master.max_cache_open_write_retries;
01641 
01642   params->oride.cache_http = INT_TO_BOOL(m_master.oride.cache_http);
01643   params->oride.cache_cluster_cache_local = INT_TO_BOOL(m_master.oride.cache_cluster_cache_local);
01644   params->oride.cache_ignore_client_no_cache = INT_TO_BOOL(m_master.oride.cache_ignore_client_no_cache);
01645   params->oride.cache_ignore_client_cc_max_age = INT_TO_BOOL(m_master.oride.cache_ignore_client_cc_max_age);
01646   params->oride.cache_ims_on_client_no_cache = INT_TO_BOOL(m_master.oride.cache_ims_on_client_no_cache);
01647   params->oride.cache_ignore_server_no_cache = INT_TO_BOOL(m_master.oride.cache_ignore_server_no_cache);
01648   params->oride.cache_responses_to_cookies = m_master.oride.cache_responses_to_cookies;
01649   params->oride.cache_ignore_auth = INT_TO_BOOL(m_master.oride.cache_ignore_auth);
01650   params->oride.cache_urls_that_look_dynamic = INT_TO_BOOL(m_master.oride.cache_urls_that_look_dynamic);
01651   params->cache_enable_default_vary_headers = INT_TO_BOOL(m_master.cache_enable_default_vary_headers);
01652   params->cache_post_method = INT_TO_BOOL(m_master.cache_post_method);
01653 
01654   params->ignore_accept_mismatch = m_master.ignore_accept_mismatch;
01655   params->ignore_accept_language_mismatch = m_master.ignore_accept_language_mismatch;
01656   params->ignore_accept_encoding_mismatch = m_master.ignore_accept_encoding_mismatch;
01657   params->ignore_accept_charset_mismatch = m_master.ignore_accept_charset_mismatch;
01658 
01659   params->send_100_continue_response = INT_TO_BOOL(m_master.send_100_continue_response);
01660 
01661   params->oride.cache_when_to_revalidate = m_master.oride.cache_when_to_revalidate;
01662 
01663   params->oride.cache_required_headers = m_master.oride.cache_required_headers;
01664   params->oride.cache_range_lookup = INT_TO_BOOL(m_master.oride.cache_range_lookup);
01665   params->oride.cache_range_write = INT_TO_BOOL(m_master.oride.cache_range_write);
01666 
01667   params->connect_ports_string = ats_strdup(m_master.connect_ports_string);
01668   params->connect_ports = parse_ports_list(params->connect_ports_string);
01669 
01670   params->oride.request_hdr_max_size = m_master.oride.request_hdr_max_size;
01671   params->oride.response_hdr_max_size = m_master.oride.response_hdr_max_size;
01672 
01673 params->push_method_enabled = INT_TO_BOOL(m_master.push_method_enabled);
01674 
01675   params->reverse_proxy_enabled = INT_TO_BOOL(m_master.reverse_proxy_enabled);
01676   params->url_remap_required = INT_TO_BOOL(m_master.url_remap_required);
01677   params->errors_log_error_pages = INT_TO_BOOL(m_master.errors_log_error_pages);
01678   params->slow_log_threshold = m_master.slow_log_threshold;
01679   params->record_cop_page = INT_TO_BOOL(m_master.record_cop_page);
01680   params->oride.send_http11_requests = m_master.oride.send_http11_requests;
01681   params->oride.doc_in_cache_skip_dns = INT_TO_BOOL(m_master.oride.doc_in_cache_skip_dns);
01682   params->oride.default_buffer_size_index = m_master.oride.default_buffer_size_index;
01683   params->oride.default_buffer_water_mark = m_master.oride.default_buffer_water_mark;
01684   params->enable_http_info = INT_TO_BOOL(m_master.enable_http_info);
01685   params->reverse_proxy_no_host_redirect = ats_strdup(m_master.reverse_proxy_no_host_redirect);
01686   params->reverse_proxy_no_host_redirect_len =
01687     params->reverse_proxy_no_host_redirect ? strlen(params->reverse_proxy_no_host_redirect) : 0;
01688 
01689   params->referer_filter_enabled = INT_TO_BOOL(m_master.referer_filter_enabled);
01690   params->referer_format_redirect = INT_TO_BOOL(m_master.referer_format_redirect);
01691 
01692   params->oride.accept_encoding_filter_enabled = INT_TO_BOOL(m_master.oride.accept_encoding_filter_enabled);
01693 
01694   params->oride.down_server_timeout = m_master.oride.down_server_timeout;
01695   params->oride.client_abort_threshold = m_master.oride.client_abort_threshold;
01696 
01697   params->oride.negative_caching_enabled = INT_TO_BOOL(m_master.oride.negative_caching_enabled);
01698   params->oride.negative_caching_lifetime = m_master.oride.negative_caching_lifetime;
01699   params->oride.negative_revalidating_enabled = INT_TO_BOOL(m_master.oride.negative_revalidating_enabled);
01700   params->oride.negative_revalidating_lifetime = m_master.oride.negative_revalidating_lifetime;
01701 
01702   //##############################################################################
01703   //#
01704   //# Redirection
01705   //#
01706   //# 1. redirection_enabled: if set to 1, redirection is enabled.
01707   //# 2. number_of_redirections: The maximum number of redirections YTS permits
01708   //# 3. post_copy_size: The maximum POST data size YTS permits to copy
01709   //# 4. redirection_host_no_port: do not include default port in host header during redirection
01710   //#
01711   //##############################################################################
01712 
01713   params->redirection_enabled = INT_TO_BOOL(m_master.redirection_enabled);
01714   params->redirection_host_no_port = INT_TO_BOOL(m_master.redirection_host_no_port);
01715   params->number_of_redirections = m_master.number_of_redirections;
01716   params->post_copy_size = m_master.post_copy_size;
01717 
01718   // Local Manager
01719   params->autoconf_port = m_master.autoconf_port;
01720   params->autoconf_localhost_only = m_master.autoconf_localhost_only;
01721 
01722   m_id = configProcessor.set(m_id, params);
01723 
01724 #undef INT_TO_BOOL
01725 }
01726 
01727 ////////////////////////////////////////////////////////////////
01728 //
01729 //  HttpConfig::acquire()
01730 //
01731 ////////////////////////////////////////////////////////////////
01732 HttpConfigParams *
01733 HttpConfig::acquire()
01734 {
01735   if (m_id != 0) {
01736     return (HttpConfigParams *) configProcessor.get(m_id);
01737   } else {
01738     return NULL;
01739   }
01740 }
01741 
01742 ////////////////////////////////////////////////////////////////
01743 //
01744 //  HttpConfig::release()
01745 //
01746 ////////////////////////////////////////////////////////////////
01747 void
01748 HttpConfig::release(HttpConfigParams * params)
01749 {
01750   configProcessor.release(m_id, params);
01751 }
01752 
01753 ////////////////////////////////////////////////////////////////
01754 //
01755 //  HttpConfig::parse_ports_list()
01756 //
01757 ////////////////////////////////////////////////////////////////
01758 HttpConfigPortRange *
01759 HttpConfig::parse_ports_list(char *ports_string)
01760 {
01761   HttpConfigPortRange *ports_list = 0;
01762 
01763   if (!ports_string)
01764     return (0);
01765 
01766   if (strchr(ports_string, '*')) {
01767     ports_list = new HttpConfigPortRange;
01768     ports_list->low = -1;
01769     ports_list->high = -1;
01770     ports_list->next = NULL;
01771   } else {
01772     HttpConfigPortRange *pr, *prev;
01773     char *start;
01774     char *end;
01775 
01776     pr = NULL;
01777     prev = NULL;
01778 
01779     start = ports_string;
01780 
01781     while (1) {                 // eat whitespace
01782       while ((start[0] != '\0') && ParseRules::is_space(start[0]))
01783         start++;
01784 
01785       // locate the end of the next number
01786       end = start;
01787       while ((end[0] != '\0') && ParseRules::is_digit(end[0]))
01788         end++;
01789 
01790       // if there is no next number we're done
01791       if (start == end)
01792         break;
01793 
01794       pr = new HttpConfigPortRange;
01795       pr->low = atoi(start);
01796       pr->high = pr->low;
01797       pr->next = NULL;
01798 
01799       if (prev)
01800         prev->next = pr;
01801       else
01802         ports_list = pr;
01803       prev = pr;
01804 
01805       // if the next character after the current port
01806       //  number is a dash then we are parsing a range
01807       if (end[0] == '-') {
01808         start = end + 1;
01809         while ((start[0] != '\0') && ParseRules::is_space(start[0]))
01810           start++;
01811 
01812         end = start;
01813         while ((end[0] != '\0') && ParseRules::is_digit(end[0]))
01814           end++;
01815 
01816         if (start == end)
01817           break;
01818 
01819         pr->high = atoi(start);
01820       }
01821 
01822       start = end;
01823 
01824       ink_release_assert(pr->low <= pr->high);
01825     }
01826   }
01827   return (ports_list);
01828 }
01829 
01830 ////////////////////////////////////////////////////////////////
01831 //
01832 //  HttpConfig::parse_url_expansions()
01833 //
01834 ////////////////////////////////////////////////////////////////
01835 char **
01836 HttpConfig::parse_url_expansions(char *url_expansions_str, int *num_expansions)
01837 {
01838   char **expansions = NULL;
01839   int count = 0, i;
01840 
01841   if (!url_expansions_str) {
01842     *num_expansions = count;
01843     return expansions;
01844   }
01845   // First count the number of URL expansions in the string
01846   char *start = url_expansions_str, *end;
01847   while (1) {
01848     // Skip whitespace
01849     while (isspace(*start))
01850       start++;
01851     if (*start == '\0')
01852       break;
01853     count++;
01854     end = start + 1;
01855 
01856     // Find end of expansion
01857     while (!isspace(*end) && *end != '\0')
01858       end++;
01859     start = end;
01860   }
01861 
01862   // Now extract the URL expansions
01863   if (count) {
01864     expansions = (char **)ats_malloc(count * sizeof(char *));
01865     start = url_expansions_str;
01866     for (i = 0; i < count; i++) {
01867       // Skip whitespace
01868       while (isspace(*start))
01869         start++;
01870       expansions[i] = start;
01871       end = start + 1;
01872 
01873       // Find end of expansion
01874       while (!isspace(*end) && *end != '\0')
01875         end++;
01876       *end = '\0';
01877       if (i < (count - 1))
01878         start = end + 1;
01879 
01880     }
01881   }
01882 
01883   *num_expansions = count;
01884   return expansions;
01885 }
01886 
01887 
01888 ////////////////////////////////////////////////////////////////
01889 //
01890 //  HttpConfig::cluster_delta_cb
01891 //
01892 ////////////////////////////////////////////////////////////////
01893 void *
01894 HttpConfig::cluster_delta_cb(void * /* opaque_token ATS_UNUSED */, char *data_raw, int /* data_len ATS_UNUSED */)
01895 {
01896   int32_t delta32 = (int32_t) atoi(data_raw);
01897   int32_t old;
01898 
01899   // Using ink_atomic_swap is mostly paranoia since a thirty bit write
01900   //  really ought to atomic.  However, any risk of bogus time is
01901   //  too ugly for me to contemplate
01902   old = ink_atomic_swap(&HttpConfig::m_master.cluster_time_delta, delta32);
01903   Debug("http_trans", "Cluster time delta moving from %d to %d", old, delta32);
01904 
01905   return NULL;
01906 
01907 }
01908 
01909 volatile int32_t icp_dynamic_enabled;

Generated by  doxygen 1.7.1