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

CacheHttp.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 <string.h>
00026 #include "P_Cache.h"
00027 
00028 
00029 /*-------------------------------------------------------------------------
00030   -------------------------------------------------------------------------*/
00031 
00032 static vec_info default_vec_info;
00033 
00034 #ifdef HTTP_CACHE
00035 static CacheHTTPInfo default_http_info;
00036 
00037 CacheHTTPInfoVector::CacheHTTPInfoVector()
00038 :magic(NULL), data(&default_vec_info, 4), xcount(0)
00039 {
00040 }
00041 
00042 /*-------------------------------------------------------------------------
00043   -------------------------------------------------------------------------*/
00044 
00045 CacheHTTPInfoVector::~CacheHTTPInfoVector()
00046 {
00047   int i;
00048 
00049   for (i = 0; i < xcount; i++) {
00050     data[i].alternate.destroy();
00051   }
00052   vector_buf.clear();
00053   magic = NULL;
00054 }
00055 
00056 /*-------------------------------------------------------------------------
00057   -------------------------------------------------------------------------*/
00058 
00059 int
00060 CacheHTTPInfoVector::insert(CacheHTTPInfo * info, int index)
00061 {
00062   if (index == CACHE_ALT_INDEX_DEFAULT)
00063     index = xcount++;
00064 
00065   data(index).alternate.copy_shallow(info);
00066   return index;
00067 }
00068 
00069 /*-------------------------------------------------------------------------
00070   -------------------------------------------------------------------------*/
00071 
00072 
00073 void
00074 CacheHTTPInfoVector::detach(int idx, CacheHTTPInfo * r)
00075 {
00076   int i;
00077 
00078   ink_assert(idx >= 0);
00079   ink_assert(idx < xcount);
00080 
00081   r->copy_shallow(&data[idx].alternate);
00082   data[idx].alternate.destroy();
00083 
00084   for (i = idx; i < (xcount - 1); i++) {
00085     data[i] = data[i + i];
00086   }
00087 
00088   xcount -= 1;
00089 }
00090 
00091 /*-------------------------------------------------------------------------
00092   -------------------------------------------------------------------------*/
00093 
00094 void
00095 CacheHTTPInfoVector::remove(int idx, bool destroy)
00096 {
00097   if (destroy)
00098     data[idx].alternate.destroy();
00099 
00100   for (; idx < (xcount - 1); idx++)
00101     data[idx] = data[idx + 1];
00102 
00103   xcount--;
00104 }
00105 
00106 /*-------------------------------------------------------------------------
00107   -------------------------------------------------------------------------*/
00108 
00109 void
00110 CacheHTTPInfoVector::clear(bool destroy)
00111 {
00112   int i;
00113 
00114   if (destroy) {
00115     for (i = 0; i < xcount; i++) {
00116       data[i].alternate.destroy();
00117     }
00118   }
00119   xcount = 0;
00120   data.clear();
00121   vector_buf.clear();
00122 }
00123 
00124 /*-------------------------------------------------------------------------
00125   -------------------------------------------------------------------------*/
00126 
00127 void
00128 CacheHTTPInfoVector::print(char *buffer, size_t buf_size, bool temps)
00129 {
00130   char buf[33], *p;
00131   int purl;
00132   int i, tmp;
00133 
00134   p = buffer;
00135   purl = 1;
00136 
00137   for (i = 0; i < xcount; i++) {
00138     if (data[i].alternate.valid()) {
00139       if (purl) {
00140         Arena arena;
00141         char *url;
00142 
00143         purl = 0;
00144         URL u;
00145         data[i].alternate.request_url_get(&u);
00146         url = u.string_get(&arena);
00147         if (url) {
00148           snprintf(p, buf_size, "[%s] ", url);
00149           tmp = strlen(p);
00150           p += tmp;
00151           buf_size -= tmp;
00152         }
00153       }
00154 
00155       if (temps || !(data[i].alternate.object_key_get() == zero_key)) {
00156         snprintf(p, buf_size, "[%d %s]", data[i].alternate.id_get(),
00157                      CacheKey(data[i].alternate.object_key_get()).toHexStr(buf));
00158         tmp = strlen(p);
00159         p += tmp;
00160         buf_size -= tmp;
00161       }
00162     }
00163   }
00164 }
00165 
00166 /*-------------------------------------------------------------------------
00167   -------------------------------------------------------------------------*/
00168 
00169 int
00170 CacheHTTPInfoVector::marshal_length()
00171 {
00172   int length = 0;
00173 
00174   for (int i = 0; i < xcount; i++) {
00175     length += data[i].alternate.marshal_length();
00176   }
00177 
00178   return length;
00179 }
00180 
00181 /*-------------------------------------------------------------------------
00182   -------------------------------------------------------------------------*/
00183 int
00184 CacheHTTPInfoVector::marshal(char *buf, int length)
00185 {
00186   char *start = buf;
00187   int count = 0;
00188 
00189   ink_assert(!(((intptr_t) buf) & 3));      // buf must be aligned
00190 
00191   for (int i = 0; i < xcount; i++) {
00192     int tmp = data[i].alternate.marshal(buf, length);
00193     length -= tmp;
00194     buf += tmp;
00195     count++;
00196   }
00197 
00198   GLOBAL_CACHE_SUM_GLOBAL_DYN_STAT(cache_hdr_vector_marshal_stat, 1);
00199   GLOBAL_CACHE_SUM_GLOBAL_DYN_STAT(cache_hdr_marshal_stat, count);
00200   GLOBAL_CACHE_SUM_GLOBAL_DYN_STAT(cache_hdr_marshal_bytes_stat, buf - start);
00201   return buf - start;
00202 }
00203 
00204 int
00205 CacheHTTPInfoVector::unmarshal(const char *buf, int length, RefCountObj * block_ptr)
00206 {
00207   ink_assert(!(((intptr_t) buf) & 3));      // buf must be aligned
00208 
00209   const char *start = buf;
00210   CacheHTTPInfo info;
00211   xcount = 0;
00212 
00213   while (length - (buf - start) > (int) sizeof(HTTPCacheAlt)) {
00214 
00215     int tmp = HTTPInfo::unmarshal((char *) buf, length - (buf - start), block_ptr);
00216     if (tmp < 0) {
00217       return -1;
00218     }
00219     info.m_alt = (HTTPCacheAlt *) buf;
00220     buf += tmp;
00221 
00222     data(xcount).alternate = info;
00223     xcount++;
00224   }
00225 
00226   return ((caddr_t) buf - (caddr_t) start);
00227 }
00228 
00229 
00230 /*-------------------------------------------------------------------------
00231   -------------------------------------------------------------------------*/
00232 uint32_t
00233 CacheHTTPInfoVector::get_handles(const char *buf, int length, RefCountObj * block_ptr)
00234 {
00235   ink_assert(!(((intptr_t) buf) & 3));      // buf must be aligned
00236 
00237   const char *start = buf;
00238   CacheHTTPInfo info;
00239   xcount = 0;
00240 
00241   vector_buf = block_ptr;
00242 
00243   while (length - (buf - start) > (int) sizeof(HTTPCacheAlt)) {
00244 
00245     int tmp = info.get_handle((char *) buf, length - (buf - start));
00246     if (tmp < 0) {
00247       ink_assert(!"CacheHTTPInfoVector::unmarshal get_handle() failed");
00248       return (uint32_t) -1;
00249     }
00250     buf += tmp;
00251 
00252     data(xcount).alternate = info;
00253     xcount++;
00254   }
00255 
00256   return ((caddr_t) buf - (caddr_t) start);
00257 }
00258 
00259 #else //HTTP_CACHE
00260 
00261 CacheHTTPInfoVector::CacheHTTPInfoVector()
00262 :data(&default_vec_info, 4), xcount(0)
00263 {
00264 }
00265 
00266 /*-------------------------------------------------------------------------
00267   -------------------------------------------------------------------------*/
00268 
00269 CacheHTTPInfoVector::~CacheHTTPInfoVector()
00270 {
00271 }
00272 
00273 /*-------------------------------------------------------------------------
00274   -------------------------------------------------------------------------*/
00275 
00276 int
00277 CacheHTTPInfoVector::insert(CacheHTTPInfo */* info ATS_UNUSED */, int index)
00278 {
00279   ink_assert(0);
00280   return index;
00281 }
00282 
00283 /*-------------------------------------------------------------------------
00284   -------------------------------------------------------------------------*/
00285 
00286 
00287 void
00288 CacheHTTPInfoVector::detach(int /* idx ATS_UNUSED */, CacheHTTPInfo */* r ATS_UNUSED */)
00289 {
00290   ink_assert(0);
00291 }
00292 
00293 /*-------------------------------------------------------------------------
00294   -------------------------------------------------------------------------*/
00295 
00296 void
00297 CacheHTTPInfoVector::remove(int /* idx ATS_UNUSED */, bool /* destroy ATS_UNUSED */)
00298 {
00299   ink_assert(0);
00300 }
00301 
00302 /*-------------------------------------------------------------------------
00303   -------------------------------------------------------------------------*/
00304 
00305 void
00306 CacheHTTPInfoVector::clear(bool /* destroy ATS_UNUSED */)
00307 {
00308 }
00309 
00310 /*-------------------------------------------------------------------------
00311   -------------------------------------------------------------------------*/
00312 
00313 void
00314 CacheHTTPInfoVector::print(char */* buffer ATS_UNUSED */, size_t /* buf_size ATS_UNUSED */, bool /* temps ATS_UNUSED */)
00315 {
00316   ink_assert(0);
00317 }
00318 
00319 /*-------------------------------------------------------------------------
00320   -------------------------------------------------------------------------*/
00321 
00322 int
00323 CacheHTTPInfoVector::marshal_length()
00324 {
00325   ink_assert(0);
00326   return 0;
00327 }
00328 
00329 /*-------------------------------------------------------------------------
00330   -------------------------------------------------------------------------*/
00331 int
00332 CacheHTTPInfoVector::marshal(char */* buf ATS_UNUSED */, int length)
00333 {
00334   ink_assert(0);
00335   return length;
00336 }
00337 
00338 int
00339 CacheHTTPInfoVector::unmarshal(const char */* buf ATS_UNUSED */, int /* length ATS_UNUSED */, RefCountObj */* block_ptr ATS_UNUSED */)
00340 {
00341   ink_assert(0);
00342   return 0;
00343 }
00344 
00345 
00346 /*-------------------------------------------------------------------------
00347   -------------------------------------------------------------------------*/
00348 uint32_t
00349 CacheHTTPInfoVector::get_handles(const char */* buf ATS_UNUSED */, int /* length ATS_UNUSED */, RefCountObj */* block_ptr ATS_UNUSED */)
00350 {
00351   ink_assert(0);
00352   return 0;
00353 }
00354 
00355 #endif //HTTP_CACHE

Generated by  doxygen 1.7.1