00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #ifndef __HTTP_H__
00025 #define __HTTP_H__
00026 
00027 
00028 #include <assert.h>
00029 #include "Arena.h"
00030 #include "INK_MD5.h"
00031 #include "MIME.h"
00032 #include "URL.h"
00033 
00034 #include "ink_apidefs.h"
00035 
00036 #define HTTP_VERSION(a,b)  ((((a) & 0xFFFF) << 16) | ((b) & 0xFFFF))
00037 #define HTTP_MINOR(v)      ((v) & 0xFFFF)
00038 #define HTTP_MAJOR(v)      (((v) >> 16) & 0xFFFF)
00039 
00040 
00041 enum HTTPStatus
00042 {
00043   HTTP_STATUS_NONE = 0,
00044 
00045   HTTP_STATUS_CONTINUE = 100,
00046   HTTP_STATUS_SWITCHING_PROTOCOL = 101,
00047 
00048   HTTP_STATUS_OK = 200,
00049   HTTP_STATUS_CREATED = 201,
00050   HTTP_STATUS_ACCEPTED = 202,
00051   HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION = 203,
00052   HTTP_STATUS_NO_CONTENT = 204,
00053   HTTP_STATUS_RESET_CONTENT = 205,
00054   HTTP_STATUS_PARTIAL_CONTENT = 206,
00055 
00056   HTTP_STATUS_MULTIPLE_CHOICES = 300,
00057   HTTP_STATUS_MOVED_PERMANENTLY = 301,
00058   HTTP_STATUS_MOVED_TEMPORARILY = 302,
00059   HTTP_STATUS_SEE_OTHER = 303,
00060   HTTP_STATUS_NOT_MODIFIED = 304,
00061   HTTP_STATUS_USE_PROXY = 305,
00062   HTTP_STATUS_TEMPORARY_REDIRECT = 307,
00063 
00064   HTTP_STATUS_BAD_REQUEST = 400,
00065   HTTP_STATUS_UNAUTHORIZED = 401,
00066   HTTP_STATUS_PAYMENT_REQUIRED = 402,
00067   HTTP_STATUS_FORBIDDEN = 403,
00068   HTTP_STATUS_NOT_FOUND = 404,
00069   HTTP_STATUS_METHOD_NOT_ALLOWED = 405,
00070   HTTP_STATUS_NOT_ACCEPTABLE = 406,
00071   HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED = 407,
00072   HTTP_STATUS_REQUEST_TIMEOUT = 408,
00073   HTTP_STATUS_CONFLICT = 409,
00074   HTTP_STATUS_GONE = 410,
00075   HTTP_STATUS_LENGTH_REQUIRED = 411,
00076   HTTP_STATUS_PRECONDITION_FAILED = 412,
00077   HTTP_STATUS_REQUEST_ENTITY_TOO_LARGE = 413,
00078   HTTP_STATUS_REQUEST_URI_TOO_LONG = 414,
00079   HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE = 415,
00080   HTTP_STATUS_RANGE_NOT_SATISFIABLE = 416,
00081 
00082   HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,
00083   HTTP_STATUS_NOT_IMPLEMENTED = 501,
00084   HTTP_STATUS_BAD_GATEWAY = 502,
00085   HTTP_STATUS_SERVICE_UNAVAILABLE = 503,
00086   HTTP_STATUS_GATEWAY_TIMEOUT = 504,
00087   HTTP_STATUS_HTTPVER_NOT_SUPPORTED = 505
00088 };
00089 
00090 enum HTTPKeepAlive
00091 {
00092   HTTP_KEEPALIVE_UNDEFINED = 0,
00093   HTTP_NO_KEEPALIVE,
00094   HTTP_KEEPALIVE
00095 };
00096 
00097 enum HTTPWarningCode
00098 {
00099   HTTP_WARNING_CODE_NONE = 0,
00100 
00101   HTTP_WARNING_CODE_RESPONSE_STALE = 110,
00102   HTTP_WARNING_CODE_REVALIDATION_FAILED = 111,
00103   HTTP_WARNING_CODE_DISCONNECTED_OPERATION = 112,
00104   HTTP_WARNING_CODE_HERUISTIC_EXPIRATION = 113,
00105   HTTP_WARNING_CODE_TRANSFORMATION_APPLIED = 114,
00106   HTTP_WARNING_CODE_MISC_WARNING = 199
00107 };
00108 
00109 
00110 enum SquidLogCode
00111 {
00112   SQUID_LOG_EMPTY = '0',
00113   SQUID_LOG_TCP_HIT = '1',
00114   SQUID_LOG_TCP_DISK_HIT = '2',
00115   SQUID_LOG_TCP_MEM_HIT = '.',  
00116   SQUID_LOG_TCP_MISS = '3',
00117   SQUID_LOG_TCP_EXPIRED_MISS = '4',
00118   SQUID_LOG_TCP_REFRESH_HIT = '5',
00119   SQUID_LOG_TCP_REF_FAIL_HIT = '6',
00120   SQUID_LOG_TCP_REFRESH_MISS = '7',
00121   SQUID_LOG_TCP_CLIENT_REFRESH = '8',
00122   SQUID_LOG_TCP_IMS_HIT = '9',
00123   SQUID_LOG_TCP_IMS_MISS = 'a',
00124   SQUID_LOG_TCP_SWAPFAIL = 'b',
00125   SQUID_LOG_TCP_DENIED = 'c',
00126   SQUID_LOG_TCP_WEBFETCH_MISS = 'd',
00127   SQUID_LOG_TCP_FUTURE_2 = 'f',
00128   SQUID_LOG_TCP_HIT_REDIRECT = '[',       
00129   SQUID_LOG_TCP_MISS_REDIRECT = ']',      
00130   SQUID_LOG_TCP_HIT_X_REDIRECT = '<',     
00131   SQUID_LOG_TCP_MISS_X_REDIRECT = '>',    
00132   SQUID_LOG_UDP_HIT = 'g',
00133   SQUID_LOG_UDP_WEAK_HIT = 'h',
00134   SQUID_LOG_UDP_HIT_OBJ = 'i',
00135   SQUID_LOG_UDP_MISS = 'j',
00136   SQUID_LOG_UDP_DENIED = 'k',
00137   SQUID_LOG_UDP_INVALID = 'l',
00138   SQUID_LOG_UDP_RELOADING = 'm',
00139   SQUID_LOG_UDP_FUTURE_1 = 'n',
00140   SQUID_LOG_UDP_FUTURE_2 = 'o',
00141   SQUID_LOG_ERR_READ_TIMEOUT = 'p',
00142   SQUID_LOG_ERR_LIFETIME_EXP = 'q',
00143   SQUID_LOG_ERR_NO_CLIENTS_BIG_OBJ = 'r',
00144   SQUID_LOG_ERR_READ_ERROR = 's',
00145   SQUID_LOG_ERR_CLIENT_ABORT = 't',
00146   SQUID_LOG_ERR_CONNECT_FAIL = 'u',
00147   SQUID_LOG_ERR_INVALID_REQ = 'v',
00148   SQUID_LOG_ERR_UNSUP_REQ = 'w',
00149   SQUID_LOG_ERR_INVALID_URL = 'x',
00150   SQUID_LOG_ERR_NO_FDS = 'y',
00151   SQUID_LOG_ERR_DNS_FAIL = 'z',
00152   SQUID_LOG_ERR_NOT_IMPLEMENTED = 'A',
00153   SQUID_LOG_ERR_CANNOT_FETCH = 'B',
00154   SQUID_LOG_ERR_NO_RELAY = 'C',
00155   SQUID_LOG_ERR_DISK_IO = 'D',
00156   SQUID_LOG_ERR_ZERO_SIZE_OBJECT = 'E',
00157   SQUID_LOG_ERR_PROXY_DENIED = 'G',
00158   SQUID_LOG_ERR_WEBFETCH_DETECTED = 'H',
00159   SQUID_LOG_ERR_FUTURE_1 = 'I',
00160   SQUID_LOG_ERR_UNKNOWN = 'Z'
00161 };
00162 
00163 
00164 enum SquidHierarchyCode
00165 {
00166   SQUID_HIER_EMPTY = '0',
00167   SQUID_HIER_NONE = '1',
00168   SQUID_HIER_DIRECT = '2',
00169   SQUID_HIER_SIBLING_HIT = '3',
00170   SQUID_HIER_PARENT_HIT = '4',
00171   SQUID_HIER_DEFAULT_PARENT = '5',
00172   SQUID_HIER_SINGLE_PARENT = '6',
00173   SQUID_HIER_FIRST_UP_PARENT = '7',
00174   SQUID_HIER_NO_PARENT_DIRECT = '8',
00175   SQUID_HIER_FIRST_PARENT_MISS = '9',
00176   SQUID_HIER_LOCAL_IP_DIRECT = 'a',
00177   SQUID_HIER_FIREWALL_IP_DIRECT = 'b',
00178   SQUID_HIER_NO_DIRECT_FAIL = 'c',
00179   SQUID_HIER_SOURCE_FASTEST = 'd',
00180   SQUID_HIER_SIBLING_UDP_HIT_OBJ = 'e',
00181   SQUID_HIER_PARENT_UDP_HIT_OBJ = 'f',
00182   SQUID_HIER_PASSTHROUGH_PARENT = 'g',
00183   SQUID_HIER_SSL_PARENT_MISS = 'h',
00184   SQUID_HIER_INVALID_CODE = 'i',
00185   SQUID_HIER_TIMEOUT_DIRECT = 'j',
00186   SQUID_HIER_TIMEOUT_SIBLING_HIT = 'k',
00187   SQUID_HIER_TIMEOUT_PARENT_HIT = 'l',
00188   SQUID_HIER_TIMEOUT_DEFAULT_PARENT = 'm',
00189   SQUID_HIER_TIMEOUT_SINGLE_PARENT = 'n',
00190   SQUID_HIER_TIMEOUT_FIRST_UP_PARENT = 'o',
00191   SQUID_HIER_TIMEOUT_NO_PARENT_DIRECT = 'p',
00192   SQUID_HIER_TIMEOUT_FIRST_PARENT_MISS = 'q',
00193   SQUID_HIER_TIMEOUT_LOCAL_IP_DIRECT = 'r',
00194   SQUID_HIER_TIMEOUT_FIREWALL_IP_DIRECT = 's',
00195   SQUID_HIER_TIMEOUT_NO_DIRECT_FAIL = 't',
00196   SQUID_HIER_TIMEOUT_SOURCE_FASTEST = 'u',
00197   SQUID_HIER_TIMEOUT_SIBLING_UDP_HIT_OBJ = 'v',
00198   SQUID_HIER_TIMEOUT_PARENT_UDP_HIT_OBJ = 'w',
00199   SQUID_HIER_TIMEOUT_PASSTHROUGH_PARENT = 'x',
00200   SQUID_HIER_TIMEOUT_TIMEOUT_SSL_PARENT_MISS = 'y',
00201   SQUID_HIER_INVALID_ASSIGNED_CODE = 'z'
00202 };
00203 
00204 
00205 enum SquidHitMissCode
00206 {
00207   SQUID_HIT_RESERVED = '0',
00208   SQUID_HIT_LEVEL_1 = '1',
00209   SQUID_HIT_LEVEL_2 = '2',
00210   SQUID_HIT_LEVEL_3 = '3',
00211   SQUID_HIT_LEVEL_4 = '4',
00212   SQUID_HIT_LEVEL_5 = '5',
00213   SQUID_HIT_LEVEL_6 = '6',
00214   SQUID_HIT_LEVEL_7 = '7',
00215   SQUID_HIT_LEVEL_8 = '8',
00216   SQUID_HIT_LEVEl_9 = '9',
00217   SQUID_MISS_NONE = '1',
00218   SQUID_MISS_ICP_AUTH = '2',
00219   SQUID_MISS_HTTP_NON_CACHE = '3',
00220   SQUID_MISS_ICP_STOPLIST = '4',
00221   SQUID_MISS_HTTP_NO_DLE = '5',
00222   SQUID_MISS_HTTP_NO_LE = '6',
00223   SQUID_MISS_HTTP_CONTENT = '7',
00224   SQUID_MISS_PRAGMA_NOCACHE = '8',
00225   SQUID_MISS_PASS = '9',
00226   SQUID_MISS_PRE_EXPIRED = 'a',
00227   SQUID_MISS_ERROR = 'b',
00228   SQUID_MISS_CACHE_BYPASS = 'c',
00229   SQUID_HIT_MISS_INVALID_ASSIGNED_CODE = 'z'
00230 };
00231 
00232 
00233 enum HTTPType
00234 {
00235   HTTP_TYPE_UNKNOWN,
00236   HTTP_TYPE_REQUEST,
00237   HTTP_TYPE_RESPONSE
00238 };
00239 
00240 struct HTTPHdrImpl:public HdrHeapObjImpl
00241 {
00242   
00243   HTTPType m_polarity;          
00244   int32_t m_version;              
00245   
00246   union
00247   {
00248     struct
00249     {
00250       URLImpl *m_url_impl;
00251       const char *m_ptr_method;
00252       uint16_t m_len_method;
00253       int16_t m_method_wks_idx;
00254     } req;
00255 
00256     struct
00257     {
00258       const char *m_ptr_reason;
00259       uint16_t m_len_reason;
00260       int16_t m_status;
00261     } resp;
00262   } u;
00263 
00264   MIMEHdrImpl *m_fields_impl;
00265 
00266   
00267   int marshal(MarshalXlate *ptr_xlate, int num_ptr, MarshalXlate *str_xlate, int num_str);
00268   void unmarshal(intptr_t offset);
00269   void move_strings(HdrStrHeap *new_heap);
00270   size_t strings_length();
00271 
00272   
00273   void check_strings(HeapCheck *heaps, int num_heaps);
00274 };
00275 
00276 struct HTTPValAccept
00277 {
00278   char *type;
00279   char *subtype;
00280   double qvalue;
00281 };
00282 
00283 
00284 struct HTTPValAcceptCharset
00285 {
00286   char *charset;
00287   double qvalue;
00288 };
00289 
00290 
00291 struct HTTPValAcceptEncoding
00292 {
00293   char *encoding;
00294   double qvalue;
00295 };
00296 
00297 
00298 struct HTTPValAcceptLanguage
00299 {
00300   char *language;
00301   double qvalue;
00302 };
00303 
00304 
00305 struct HTTPValFieldList
00306 {
00307   char *name;
00308   HTTPValFieldList *next;
00309 };
00310 
00311 
00312 struct HTTPValCacheControl
00313 {
00314   const char *directive;
00315 
00316   union
00317   {
00318     int delta_seconds;
00319     HTTPValFieldList *field_names;
00320   } u;
00321 };
00322 
00323 
00324 struct HTTPValRange
00325 {
00326   int start;
00327   int end;
00328   HTTPValRange *next;
00329 };
00330 
00331 
00332 struct HTTPValTE
00333 {
00334   char *encoding;
00335   double qvalue;
00336 };
00337 
00338 
00339 struct HTTPParser
00340 {
00341   bool m_parsing_http;
00342   MIMEParser m_mime_parser;
00343 };
00344 
00345 
00346 extern const char *HTTP_METHOD_CONNECT;
00347 extern const char *HTTP_METHOD_DELETE;
00348 extern const char *HTTP_METHOD_GET;
00349 extern const char *HTTP_METHOD_HEAD;
00350 extern const char *HTTP_METHOD_ICP_QUERY;
00351 extern const char *HTTP_METHOD_OPTIONS;
00352 extern const char *HTTP_METHOD_POST;
00353 extern const char *HTTP_METHOD_PURGE;
00354 extern const char *HTTP_METHOD_PUT;
00355 extern const char *HTTP_METHOD_TRACE;
00356 extern const char *HTTP_METHOD_PUSH;
00357 
00358 extern int HTTP_WKSIDX_CONNECT;
00359 extern int HTTP_WKSIDX_DELETE;
00360 extern int HTTP_WKSIDX_GET;
00361 extern int HTTP_WKSIDX_HEAD;
00362 extern int HTTP_WKSIDX_ICP_QUERY;
00363 extern int HTTP_WKSIDX_OPTIONS;
00364 extern int HTTP_WKSIDX_POST;
00365 extern int HTTP_WKSIDX_PURGE;
00366 extern int HTTP_WKSIDX_PUT;
00367 extern int HTTP_WKSIDX_TRACE;
00368 extern int HTTP_WKSIDX_PUSH;
00369 extern int HTTP_WKSIDX_METHODS_CNT;
00370 
00371 
00372 extern int HTTP_LEN_CONNECT;
00373 extern int HTTP_LEN_DELETE;
00374 extern int HTTP_LEN_GET;
00375 extern int HTTP_LEN_HEAD;
00376 extern int HTTP_LEN_ICP_QUERY;
00377 extern int HTTP_LEN_OPTIONS;
00378 extern int HTTP_LEN_POST;
00379 extern int HTTP_LEN_PURGE;
00380 extern int HTTP_LEN_PUT;
00381 extern int HTTP_LEN_TRACE;
00382 extern int HTTP_LEN_PUSH;
00383 
00384 extern const char *HTTP_VALUE_BYTES;
00385 extern const char *HTTP_VALUE_CHUNKED;
00386 extern const char *HTTP_VALUE_CLOSE;
00387 extern const char *HTTP_VALUE_COMPRESS;
00388 extern const char *HTTP_VALUE_DEFLATE;
00389 extern const char *HTTP_VALUE_GZIP;
00390 extern const char *HTTP_VALUE_IDENTITY;
00391 extern const char *HTTP_VALUE_KEEP_ALIVE;
00392 extern const char *HTTP_VALUE_MAX_AGE;
00393 extern const char *HTTP_VALUE_MAX_STALE;
00394 extern const char *HTTP_VALUE_MIN_FRESH;
00395 extern const char *HTTP_VALUE_MUST_REVALIDATE;
00396 extern const char *HTTP_VALUE_NONE;
00397 extern const char *HTTP_VALUE_NO_CACHE;
00398 extern const char *HTTP_VALUE_NO_STORE;
00399 extern const char *HTTP_VALUE_NO_TRANSFORM;
00400 extern const char *HTTP_VALUE_ONLY_IF_CACHED;
00401 extern const char *HTTP_VALUE_PRIVATE;
00402 extern const char *HTTP_VALUE_PROXY_REVALIDATE;
00403 extern const char *HTTP_VALUE_PUBLIC;
00404 extern const char *HTTP_VALUE_S_MAXAGE;
00405 extern const char *HTTP_VALUE_NEED_REVALIDATE_ONCE;
00406 extern const char *HTTP_VALUE_100_CONTINUE;
00407 
00408 extern int HTTP_LEN_BYTES;
00409 extern int HTTP_LEN_CHUNKED;
00410 extern int HTTP_LEN_CLOSE;
00411 extern int HTTP_LEN_COMPRESS;
00412 extern int HTTP_LEN_DEFLATE;
00413 extern int HTTP_LEN_GZIP;
00414 extern int HTTP_LEN_IDENTITY;
00415 extern int HTTP_LEN_KEEP_ALIVE;
00416 extern int HTTP_LEN_MAX_AGE;
00417 extern int HTTP_LEN_MAX_STALE;
00418 extern int HTTP_LEN_MIN_FRESH;
00419 extern int HTTP_LEN_MUST_REVALIDATE;
00420 extern int HTTP_LEN_NONE;
00421 extern int HTTP_LEN_NO_CACHE;
00422 extern int HTTP_LEN_NO_STORE;
00423 extern int HTTP_LEN_NO_TRANSFORM;
00424 extern int HTTP_LEN_ONLY_IF_CACHED;
00425 extern int HTTP_LEN_PRIVATE;
00426 extern int HTTP_LEN_PROXY_REVALIDATE;
00427 extern int HTTP_LEN_PUBLIC;
00428 extern int HTTP_LEN_S_MAXAGE;
00429 extern int HTTP_LEN_NEED_REVALIDATE_ONCE;
00430 extern int HTTP_LEN_100_CONTINUE;
00431 
00432 
00433 void http_hdr_adjust(HTTPHdrImpl *hdrp, int32_t offset, int32_t length, int32_t delta);
00434 
00435 
00436 void http_init();
00437 
00438 inkcoreapi HTTPHdrImpl *http_hdr_create(HdrHeap *heap, HTTPType polarity);
00439 void http_hdr_init(HdrHeap *heap, HTTPHdrImpl *hh, HTTPType polarity);
00440 HTTPHdrImpl *http_hdr_clone(HTTPHdrImpl *s_hh, HdrHeap *s_heap, HdrHeap *d_heap);
00441 void http_hdr_copy_onto(HTTPHdrImpl *s_hh, HdrHeap *s_heap, HTTPHdrImpl *d_hh, HdrHeap *d_heap, bool inherit_strs);
00442 
00443 inkcoreapi int http_hdr_print(HdrHeap *heap, HTTPHdrImpl *hh, char *buf, int bufsize, int *bufindex, int *dumpoffset);
00444 
00445 void http_hdr_describe(HdrHeapObjImpl *obj, bool recurse = true);
00446 
00447 int http_hdr_length_get(HTTPHdrImpl *hh);
00448 
00449 
00450 
00451 inkcoreapi void http_hdr_version_set(HTTPHdrImpl *hh, int32_t ver);
00452 
00453 const char *http_hdr_method_get(HTTPHdrImpl *hh, int *length);
00454 inkcoreapi void http_hdr_method_set(HdrHeap *heap, HTTPHdrImpl *hh,
00455                                     const char *method, int16_t method_wks_idx, int method_length, bool must_copy);
00456 
00457 void http_hdr_url_set(HdrHeap *heap, HTTPHdrImpl *hh, URLImpl *url);
00458 
00459 
00460 void http_hdr_status_set(HTTPHdrImpl *hh, HTTPStatus status);
00461 const char *http_hdr_reason_get(HTTPHdrImpl *hh, int *length);
00462 void http_hdr_reason_set(HdrHeap *heap, HTTPHdrImpl *hh, const char *value, int length, bool must_copy);
00463 const char *http_hdr_reason_lookup(unsigned status);
00464 
00465 void http_parser_init(HTTPParser *parser);
00466 void http_parser_clear(HTTPParser *parser);
00467 MIMEParseResult http_parser_parse_req(HTTPParser *parser, HdrHeap *heap,
00468                                       HTTPHdrImpl *hh, const char **start,
00469                                       const char *end, bool must_copy_strings, bool eof);
00470 MIMEParseResult http_parser_parse_resp(HTTPParser *parser, HdrHeap *heap,
00471                                        HTTPHdrImpl *hh, const char **start,
00472                                        const char *end, bool must_copy_strings, bool eof);
00473 HTTPStatus http_parse_status(const char *start, const char *end);
00474 int32_t http_parse_version(const char *start, const char *end);
00475 
00476 
00477 
00478 
00479 
00480 
00481 
00482 
00483 
00484 
00485 
00486 HTTPValTE *http_parse_te(const char *buf, int len, Arena *arena);
00487 
00488 
00489 class HTTPVersion
00490 {
00491 public:
00492   HTTPVersion();
00493   explicit HTTPVersion(int32_t version);
00494   HTTPVersion(int ver_major, int ver_minor);
00495 
00496   void set(HTTPVersion ver);
00497   void set(int ver_major, int ver_minor);
00498 
00499   HTTPVersion & operator =(const HTTPVersion & hv);
00500   int operator ==(const HTTPVersion & hv) const;
00501   int operator !=(const HTTPVersion & hv) const;
00502   int operator >(const HTTPVersion & hv) const;
00503   int operator <(const HTTPVersion & hv) const;
00504   int operator >=(const HTTPVersion & hv) const;
00505   int operator <=(const HTTPVersion & hv) const;
00506 
00507 public:
00508     int32_t m_version;
00509 };
00510 
00511 class IOBufferReader;
00512 
00513 class HTTPHdr: public MIMEHdr
00514 {
00515 public:
00516   HTTPHdrImpl *m_http;
00517   
00518   mutable URL m_url_cached;
00519   mutable MIMEField *m_host_mime;
00520   mutable int m_host_length; 
00521   mutable int m_port; 
00522   mutable bool m_target_cached; 
00523   mutable bool m_target_in_url; 
00524 
00525 
00526 
00527 
00528   mutable bool m_port_in_header;
00529 
00530   HTTPHdr();
00531   ~HTTPHdr();
00532 
00533   int valid() const;
00534 
00535   void create(HTTPType polarity, HdrHeap *heap = NULL);
00536   void clear();
00537   void reset();
00538   void copy(const HTTPHdr *hdr);
00539   void copy_shallow(const HTTPHdr *hdr);
00540 
00541   int unmarshal(char *buf, int len, RefCountObj *block_ref);
00542 
00543   int print(char *buf, int bufsize, int *bufindex, int *dumpoffset);
00544 
00545   int length_get();
00546 
00547   HTTPType type_get() const;
00548 
00549   HTTPVersion version_get();
00550   void version_set(HTTPVersion version);
00551 
00552   const char *method_get(int *length);
00553   int method_get_wksidx();
00554   void method_set(const char *value, int length);
00555 
00556   URL *url_create(URL *url);
00557 
00558   URL *url_get() const;
00559   URL *url_get(URL *url);
00560 
00561 
00562 
00563 
00564 
00565 
00566 
00567 
00568   char* url_string_get(
00569     Arena* arena = 0, 
00570     int* length = 0 
00571   );
00572 
00573 
00574 
00575 
00576 
00577   char* url_string_get_ref(
00578     int* length = 0 
00579   );
00580 
00581 
00582 
00583 
00584 
00585   int url_print(
00586       char* buff, 
00587       int length, 
00588       int* offset, 
00589       int* skip 
00590   );
00591 
00592 
00593 
00594 
00595 
00596   char const* path_get(
00597                        int* length 
00598                        );
00599 
00600 
00601 
00602 
00603 
00604 
00605   char const* host_get(int* length = 0);
00606 
00607 
00608 
00609 
00610 
00611 
00612 
00613   int port_get();
00614 
00615 
00616 
00617 
00618 
00619   char const* scheme_get(
00620                        int* length 
00621                        );
00622   void url_set(URL *url);
00623   void url_set_as_server_url(URL *url);
00624   void url_set(const char *str, int length);
00625 
00626 
00627 
00628 
00629   bool is_target_in_url() const;
00630 
00631 
00632 
00633   bool is_port_in_header() const;
00634 
00635 
00636 
00637 
00638 
00639   void set_url_target_from_host_field(URL* url = 0);
00640 
00641 
00642 
00643 
00644   void mark_target_dirty() const;
00645 
00646   HTTPStatus status_get();
00647   void status_set(HTTPStatus status);
00648 
00649   const char *reason_get(int *length);
00650   void reason_set(const char *value, int length);
00651 
00652   MIMEParseResult parse_req(HTTPParser *parser, const char **start, const char *end, bool eof);
00653   MIMEParseResult parse_resp(HTTPParser *parser, const char **start, const char *end, bool eof);
00654 
00655   MIMEParseResult parse_req(HTTPParser *parser, IOBufferReader *r, int *bytes_used, bool eof);
00656   MIMEParseResult parse_resp(HTTPParser *parser, IOBufferReader *r, int *bytes_used, bool eof);
00657 
00658 public:
00659   
00660   bool is_cache_control_set(const char *cc_directive_wks);
00661   bool is_pragma_no_cache_set();
00662 
00663 protected:
00664 
00665 
00666 
00667   void _fill_target_cache() const;
00668 
00669 
00670 
00671 
00672 
00673   void _test_and_fill_target_cache() const;
00674 
00675   static Arena* const USE_HDR_HEAP_MAGIC;
00676 
00677 private:
00678   
00679   HTTPHdr(const HTTPHdr & m);
00680   HTTPHdr & operator =(const HTTPHdr & m);
00681 
00682   friend class UrlPrintHack; 
00683 };
00684 
00685 
00686 
00687 
00688 
00689 inline HTTPVersion::HTTPVersion()
00690 :m_version(HTTP_VERSION(0, 9))
00691 {
00692 }
00693 
00694 
00695 
00696 
00697 inline HTTPVersion::HTTPVersion(int32_t version)
00698 :m_version(version)
00699 {
00700 }
00701 
00702 
00703 
00704 
00705 inline HTTPVersion::HTTPVersion(int ver_major, int ver_minor)
00706   :
00707 m_version(HTTP_VERSION(ver_major, ver_minor))
00708 {
00709 }
00710 
00711 
00712 
00713 
00714 inline void
00715 HTTPVersion::set(HTTPVersion ver)
00716 {
00717   m_version = ver.m_version;
00718 }
00719 
00720 
00721 
00722 
00723 inline void
00724 HTTPVersion::set(int ver_major, int ver_minor)
00725 {
00726   m_version = HTTP_VERSION(ver_major, ver_minor);
00727 }
00728 
00729 
00730 
00731 
00732 inline HTTPVersion &
00733 HTTPVersion::operator =(const HTTPVersion & hv)
00734 {
00735   m_version = hv.m_version;
00736 
00737   return *this;
00738 }
00739 
00740 
00741 
00742 
00743 inline int
00744 HTTPVersion::operator ==(const HTTPVersion & hv) const
00745 {
00746   return (m_version == hv.m_version);
00747 }
00748 
00749 
00750 
00751 
00752 inline int
00753 HTTPVersion::operator !=(const HTTPVersion & hv) const
00754 {
00755   return (m_version != hv.m_version);
00756 }
00757 
00758 
00759 
00760 
00761 inline int
00762 HTTPVersion::operator >(const HTTPVersion & hv) const
00763 {
00764   return (m_version > hv.m_version);
00765 }
00766 
00767 
00768 
00769 
00770 inline int
00771 HTTPVersion::operator <(const HTTPVersion & hv) const
00772 {
00773   return (m_version < hv.m_version);
00774 }
00775 
00776 
00777 
00778 
00779 inline int
00780 HTTPVersion::operator >=(const HTTPVersion & hv) const
00781 {
00782   return (m_version >= hv.m_version);
00783 }
00784 
00785 
00786 
00787 
00788 inline int
00789 HTTPVersion::operator <=(const HTTPVersion & hv) const
00790 {
00791   return (m_version <= hv.m_version);
00792 }
00793 
00794 
00795 
00796 
00797 
00798 inline
00799 HTTPHdr::HTTPHdr()
00800   : MIMEHdr(), m_http(NULL), m_url_cached(), m_target_cached(false)
00801 { }
00802 
00803 
00804 
00805 
00806 inline
00807 HTTPHdr::~HTTPHdr()
00808 {                               
00809 }
00810 
00811 
00812 
00813 
00814 inline int
00815 HTTPHdr::valid() const
00816 {
00817   return (m_http && m_mime && m_heap);
00818 }
00819 
00820 
00821 
00822 
00823 inline void
00824 HTTPHdr::create(HTTPType polarity, HdrHeap *heap)
00825 {
00826   if (heap) {
00827     m_heap = heap;
00828   } else if (!m_heap) {
00829     m_heap = new_HdrHeap();
00830   }
00831 
00832   m_http = http_hdr_create(m_heap, polarity);
00833   m_mime = m_http->m_fields_impl;
00834 }
00835 
00836 inline void
00837 HTTPHdr::clear()
00838 {
00839 
00840   if (m_http && m_http->m_polarity == HTTP_TYPE_REQUEST) {
00841     m_url_cached.clear();
00842   }
00843   this->HdrHeapSDKHandle::clear();
00844   m_http = NULL;
00845   m_mime = NULL;
00846 }
00847 
00848 inline void
00849 HTTPHdr::reset()
00850 {
00851   m_heap = NULL;
00852   m_http = NULL;
00853   m_mime = NULL;
00854   m_url_cached.reset();
00855 }
00856 
00857 
00858 
00859 
00860 inline void
00861 HTTPHdr::copy(const HTTPHdr *hdr)
00862 {
00863   ink_assert(hdr->valid());
00864 
00865   if (valid()) {
00866     http_hdr_copy_onto(hdr->m_http, hdr->m_heap, m_http, m_heap, (m_heap != hdr->m_heap) ? true : false);
00867   } else {
00868     m_heap = new_HdrHeap();
00869     m_http = http_hdr_clone(hdr->m_http, hdr->m_heap, m_heap);
00870     m_mime = m_http->m_fields_impl;
00871   }
00872 }
00873 
00874 
00875 
00876 
00877 inline void
00878 HTTPHdr::copy_shallow(const HTTPHdr *hdr)
00879 {
00880   ink_assert(hdr->valid());
00881 
00882   m_heap = hdr->m_heap;
00883   m_http = hdr->m_http;
00884   m_mime = hdr->m_mime;
00885 
00886   if (hdr->type_get() == HTTP_TYPE_REQUEST && m_url_cached.valid())
00887     m_url_cached.copy_shallow(&hdr->m_url_cached);
00888 }
00889 
00890 
00891 
00892 
00893 inline int
00894 HTTPHdr::print(char *buf, int bufsize, int *bufindex, int *dumpoffset)
00895 {
00896   ink_assert(valid());
00897   return http_hdr_print(m_heap, m_http, buf, bufsize, bufindex, dumpoffset);
00898 }
00899 
00900 
00901 
00902 
00903 inline int
00904 HTTPHdr::length_get()
00905 {
00906   ink_assert(valid());
00907   return http_hdr_length_get(m_http);
00908 }
00909 
00910 
00911 
00912 
00913 inline void
00914 HTTPHdr::_test_and_fill_target_cache() const {
00915   if (!m_target_cached) this->_fill_target_cache();
00916 }
00917 
00918 
00919 
00920 
00921 inline char const*
00922 HTTPHdr::host_get(int* length)
00923 {
00924   this->_test_and_fill_target_cache();
00925   if (m_target_in_url) {
00926     return url_get()->host_get(length);
00927   } else if (m_host_mime) {
00928     if (length) *length = m_host_length;
00929     return m_host_mime->m_ptr_value;
00930   }
00931 
00932   if (length) *length = 0;
00933   return NULL;
00934 }
00935 
00936 
00937 
00938 
00939 inline int
00940 HTTPHdr::port_get()
00941 {
00942   this->_test_and_fill_target_cache();
00943   return m_port;
00944 }
00945 
00946 
00947 
00948 
00949 inline bool
00950 HTTPHdr::is_target_in_url() const
00951 {
00952   this->_test_and_fill_target_cache();
00953   return m_target_in_url;
00954 }
00955 
00956 
00957 
00958 
00959 inline bool
00960 HTTPHdr::is_port_in_header() const
00961 {
00962   this->_test_and_fill_target_cache();
00963   return m_port_in_header;
00964 }
00965 
00966 
00967 
00968 
00969 inline void
00970 HTTPHdr::mark_target_dirty() const
00971 {
00972   m_target_cached = false;
00973 }
00974 
00975 
00976 
00977 inline HTTPType
00978 http_hdr_type_get(HTTPHdrImpl *hh)
00979 {
00980   return (hh->m_polarity);
00981 }
00982 
00983 
00984 
00985 
00986 inline HTTPType
00987 HTTPHdr::type_get() const
00988 {
00989   ink_assert(valid());
00990   return http_hdr_type_get(m_http);
00991 }
00992 
00993 
00994 
00995 
00996 inline int32_t
00997 http_hdr_version_get(HTTPHdrImpl *hh)
00998 {
00999   return (hh->m_version);
01000 }
01001 
01002 
01003 
01004 
01005 inline HTTPVersion
01006 HTTPHdr::version_get()
01007 {
01008   ink_assert(valid());
01009   return HTTPVersion(http_hdr_version_get(m_http));
01010 }
01011 
01012 
01013 
01014 
01015 inline void
01016 HTTPHdr::version_set(HTTPVersion version)
01017 {
01018   ink_assert(valid());
01019   http_hdr_version_set(m_http, version.m_version);
01020 }
01021 
01022 
01023 
01024 
01025 inline const char *
01026 HTTPHdr::method_get(int *length)
01027 {
01028   ink_assert(valid());
01029   ink_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
01030 
01031   return http_hdr_method_get(m_http, length);
01032 }
01033 
01034 
01035 inline int
01036 HTTPHdr::method_get_wksidx()
01037 {
01038   ink_assert(valid());
01039   ink_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
01040 
01041   return (m_http->u.req.m_method_wks_idx);
01042 }
01043 
01044 
01045 
01046 
01047 
01048 inline void
01049 HTTPHdr::method_set(const char *value, int length)
01050 {
01051   ink_assert(valid());
01052   ink_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
01053 
01054   int method_wks_idx = hdrtoken_tokenize(value, length);
01055   http_hdr_method_set(m_heap, m_http, value, method_wks_idx, length, true);
01056 }
01057 
01058 
01059 
01060 
01061 inline URL *
01062 HTTPHdr::url_create(URL *u)
01063 {
01064   ink_assert(valid());
01065   ink_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
01066 
01067   u->set(this);
01068   u->create(m_heap);
01069   return (u);
01070 }
01071 
01072 
01073 
01074 
01075 inline URL *
01076 HTTPHdr::url_get() const
01077 {
01078   ink_assert(valid());
01079   ink_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
01080 
01081   
01082   
01083   
01084 
01085   URLImpl *real_impl = m_http->u.req.m_url_impl;
01086   if (m_url_cached.m_url_impl != real_impl) {
01087     m_url_cached.set(this);
01088     m_url_cached.m_url_impl = real_impl;
01089     this->mark_target_dirty();
01090   }
01091   return (&m_url_cached);
01092 }
01093 
01094 
01095 
01096 
01097 inline URL *
01098 HTTPHdr::url_get(URL *url)
01099 {
01100   ink_assert(valid());
01101   ink_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
01102 
01103   url->set(this);               
01104   url->m_url_impl = m_http->u.req.m_url_impl;
01105   return (url);
01106 }
01107 
01108 
01109 
01110 
01111 inline void
01112 HTTPHdr::url_set(URL *url)
01113 {
01114   ink_assert(valid());
01115   ink_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
01116 
01117   URLImpl *url_impl = m_http->u.req.m_url_impl;
01118   ::url_copy_onto(url->m_url_impl, url->m_heap, url_impl, m_heap, true);
01119 }
01120 
01121 
01122 
01123 
01124 inline void
01125 HTTPHdr::url_set_as_server_url(URL *url)
01126 {
01127   ink_assert(valid());
01128   ink_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
01129 
01130   URLImpl *url_impl = m_http->u.req.m_url_impl;
01131   ::url_copy_onto_as_server_url(url->m_url_impl, url->m_heap, url_impl, m_heap, true);
01132 }
01133 
01134 
01135 
01136 
01137 inline void
01138 HTTPHdr::url_set(const char *str, int length)
01139 {
01140   URLImpl *url_impl;
01141 
01142   ink_assert(valid());
01143   ink_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
01144 
01145   url_impl = m_http->u.req.m_url_impl;
01146   ::url_clear(url_impl);
01147   ::url_parse(m_heap, url_impl, &str, str + length, true);
01148 }
01149 
01150 
01151 
01152 
01153 inline HTTPStatus
01154 http_hdr_status_get(HTTPHdrImpl *hh)
01155 {
01156   ink_assert(hh->m_polarity == HTTP_TYPE_RESPONSE);
01157   return (HTTPStatus) hh->u.resp.m_status;
01158 }
01159 
01160 
01161 
01162 
01163 inline HTTPStatus
01164 HTTPHdr::status_get()
01165 {
01166   ink_assert(valid());
01167   ink_assert(m_http->m_polarity == HTTP_TYPE_RESPONSE);
01168 
01169   return (NULL == m_http) ? HTTP_STATUS_NONE : http_hdr_status_get(m_http);
01170 }
01171 
01172 
01173 
01174 
01175 inline void
01176 HTTPHdr::status_set(HTTPStatus status)
01177 {
01178   ink_assert(valid());
01179   ink_assert(m_http->m_polarity == HTTP_TYPE_RESPONSE);
01180 
01181   http_hdr_status_set(m_http, status);
01182 }
01183 
01184 
01185 
01186 
01187 inline const char *
01188 HTTPHdr::reason_get(int *length)
01189 {
01190   ink_assert(valid());
01191   ink_assert(m_http->m_polarity == HTTP_TYPE_RESPONSE);
01192 
01193   return http_hdr_reason_get(m_http, length);
01194 }
01195 
01196 
01197 
01198 
01199 inline void
01200 HTTPHdr::reason_set(const char *value, int length)
01201 {
01202   ink_assert(valid());
01203   ink_assert(m_http->m_polarity == HTTP_TYPE_RESPONSE);
01204 
01205   http_hdr_reason_set(m_heap, m_http, value, length, true);
01206 }
01207 
01208 
01209 
01210 
01211 inline MIMEParseResult
01212 HTTPHdr::parse_req(HTTPParser *parser, const char **start, const char *end, bool eof)
01213 {
01214   ink_assert(valid());
01215   ink_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
01216 
01217   return http_parser_parse_req(parser, m_heap, m_http, start, end, true, eof);
01218 }
01219 
01220 
01221 
01222 
01223 inline MIMEParseResult
01224 HTTPHdr::parse_resp(HTTPParser *parser, const char **start, const char *end, bool eof)
01225 {
01226   ink_assert(valid());
01227   ink_assert(m_http->m_polarity == HTTP_TYPE_RESPONSE);
01228 
01229   return http_parser_parse_resp(parser, m_heap, m_http, start, end, true, eof);
01230 }
01231 
01232 
01233 
01234 
01235 inline bool
01236 HTTPHdr::is_cache_control_set(const char *cc_directive_wks)
01237 {
01238   ink_assert(valid());
01239   ink_assert(hdrtoken_is_wks(cc_directive_wks));
01240 
01241   HdrTokenHeapPrefix *prefix = hdrtoken_wks_to_prefix(cc_directive_wks);
01242   ink_assert(prefix->wks_token_type == HDRTOKEN_TYPE_CACHE_CONTROL);
01243 
01244   uint32_t cc_mask = prefix->wks_type_specific.u.cache_control.cc_mask;
01245   if (get_cooked_cc_mask() & cc_mask)
01246     return (true);
01247   else
01248     return (false);
01249 }
01250 
01251 
01252 
01253 
01254 inline bool
01255 HTTPHdr::is_pragma_no_cache_set()
01256 {
01257   ink_assert(valid());
01258   return (get_cooked_pragma_no_cache());
01259 }
01260 
01261 inline char*
01262 HTTPHdr::url_string_get_ref(int* length)
01263 {
01264   return this->url_string_get(USE_HDR_HEAP_MAGIC, length);
01265 }
01266 
01267 inline char const*
01268 HTTPHdr::path_get(int* length)
01269 {
01270   URL* url = this->url_get();
01271   return url ? url->path_get(length) : 0;
01272 }
01273 
01274 inline char const*
01275 HTTPHdr::scheme_get(int* length)
01276 {
01277   URL* url = this->url_get();
01278   return url ? url->scheme_get(length) : 0;
01279 }
01280 
01281 
01282 
01283 
01284 enum
01285 {
01286   CACHE_ALT_MAGIC_ALIVE = 0xabcddeed,
01287   CACHE_ALT_MAGIC_MARSHALED = 0xdcbadeed,
01288   CACHE_ALT_MAGIC_DEAD = 0xdeadeed
01289 };
01290 
01291 
01292 struct HTTPCacheAlt
01293 {
01294   HTTPCacheAlt();
01295   void copy(HTTPCacheAlt *to_copy);
01296   void copy_frag_offsets_from(HTTPCacheAlt* src);
01297   void destroy();
01298 
01299   uint32_t m_magic;
01300 
01301   
01302   
01303   
01304   
01305   
01306   int32_t m_writeable;
01307   int32_t m_unmarshal_len;
01308 
01309   int32_t m_id;
01310   int32_t m_rid;
01311 
01312   int32_t m_object_key[4];
01313   int32_t m_object_size[2];
01314 
01315   HTTPHdr m_request_hdr;
01316   HTTPHdr m_response_hdr;
01317 
01318   time_t m_request_sent_time;
01319   time_t m_response_received_time;
01320 
01321 
01322 
01323   int m_frag_offset_count;
01324 
01325   typedef uint64_t FragOffset;
01326 
01327 
01328 
01329 
01330 
01331   FragOffset *m_frag_offsets;
01332 
01333   static int const N_INTEGRAL_FRAG_OFFSETS = 4;
01334 
01335   FragOffset m_integral_frag_offsets[N_INTEGRAL_FRAG_OFFSETS];
01336 
01337   
01338   
01339   
01340   
01341   
01342   
01343   
01344   RefCountObj *m_ext_buffer;
01345 };
01346 
01347 class HTTPInfo
01348 {
01349 public:
01350   typedef HTTPCacheAlt::FragOffset FragOffset; 
01351 
01352   HTTPCacheAlt *m_alt;
01353 
01354   HTTPInfo()
01355     : m_alt(NULL)
01356   { }
01357 
01358   ~HTTPInfo()
01359   {
01360     clear();
01361   }
01362 
01363   void clear() { m_alt = NULL; }
01364   bool valid() const { return m_alt != NULL; }
01365 
01366   void create();
01367   void destroy();
01368 
01369   void copy(HTTPInfo *to_copy);
01370   void copy_shallow(HTTPInfo *info) { m_alt = info->m_alt; }
01371   void copy_frag_offsets_from(HTTPInfo* src);
01372   HTTPInfo & operator =(const HTTPInfo & m);
01373 
01374   inkcoreapi int marshal_length();
01375   inkcoreapi int marshal(char *buf, int len);
01376   static int unmarshal(char *buf, int len, RefCountObj *block_ref);
01377   void set_buffer_reference(RefCountObj *block_ref);
01378   int get_handle(char *buf, int len);
01379 
01380   int32_t id_get() const { return m_alt->m_id; }
01381   int32_t rid_get() { return m_alt->m_rid; }
01382 
01383   void id_set(int32_t id) { m_alt->m_id = id; }
01384   void rid_set(int32_t id) { m_alt->m_rid = id; }
01385 
01386   INK_MD5 object_key_get();
01387   void object_key_get(INK_MD5 *);
01388   bool compare_object_key(const INK_MD5 *);
01389   int64_t object_size_get();
01390 
01391   void request_get(HTTPHdr *hdr) { hdr->copy_shallow(&m_alt->m_request_hdr); }
01392   void response_get(HTTPHdr *hdr) { hdr->copy_shallow(&m_alt->m_response_hdr); }
01393 
01394   HTTPHdr *request_get() { return &m_alt->m_request_hdr; }
01395   HTTPHdr *response_get() { return &m_alt->m_response_hdr; }
01396 
01397   URL *request_url_get(URL *url = NULL) { return m_alt->m_request_hdr.url_get(url); }
01398 
01399   time_t request_sent_time_get() { return m_alt->m_request_sent_time; }
01400   time_t response_received_time_get() { return m_alt->m_response_received_time; }
01401 
01402   void object_key_set(INK_MD5 & md5);
01403   void object_size_set(int64_t size);
01404 
01405   void request_set(const HTTPHdr *req) { m_alt->m_request_hdr.copy(req); }
01406   void response_set(const HTTPHdr *resp) { m_alt->m_response_hdr.copy(resp); }
01407 
01408   void request_sent_time_set(time_t t) { m_alt->m_request_sent_time = t; }
01409   void response_received_time_set(time_t t) { m_alt->m_response_received_time = t; }
01410 
01411 
01412   FragOffset* get_frag_table();
01413 
01414 
01415 
01416   int get_frag_offset_count();
01417 
01418   void push_frag_offset(FragOffset offset);
01419 
01420   
01421   static bool check_marshalled(char *buf, int len);
01422 
01423 private:
01424   HTTPInfo(const HTTPInfo & h);
01425 };
01426 
01427 inline void
01428 HTTPInfo::destroy()
01429 {
01430   if (m_alt) {
01431     if (m_alt->m_writeable) {
01432       m_alt->destroy();
01433     } else if (m_alt->m_ext_buffer) {
01434       if (m_alt->m_ext_buffer->refcount_dec() == 0) {
01435         m_alt->m_ext_buffer->free();
01436       }
01437     }
01438   }
01439   clear();
01440 }
01441 
01442 inline HTTPInfo &
01443 HTTPInfo::operator =(const HTTPInfo & m)
01444 {
01445   m_alt = m.m_alt;
01446   return *this;
01447 }
01448 
01449 inline INK_MD5
01450 HTTPInfo::object_key_get()
01451 {
01452   INK_MD5 val;
01453   int32_t* pi = reinterpret_cast<int32_t*>(&val);
01454 
01455   pi[0] = m_alt->m_object_key[0];
01456   pi[1] = m_alt->m_object_key[1];
01457   pi[2] = m_alt->m_object_key[2];
01458   pi[3] = m_alt->m_object_key[3];
01459 
01460   return val;
01461 }
01462 
01463 inline void
01464 HTTPInfo::object_key_get(INK_MD5 *md5)
01465 {
01466   int32_t* pi = reinterpret_cast<int32_t*>(md5);
01467   pi[0] = m_alt->m_object_key[0];
01468   pi[1] = m_alt->m_object_key[1];
01469   pi[2] = m_alt->m_object_key[2];
01470   pi[3] = m_alt->m_object_key[3];
01471 }
01472 
01473 inline bool
01474 HTTPInfo::compare_object_key(const INK_MD5 *md5)
01475 {
01476   int32_t const* pi = reinterpret_cast<int32_t const*>(md5);
01477   return ((m_alt->m_object_key[0] == pi[0]) &&
01478           (m_alt->m_object_key[1] == pi[1]) &&
01479           (m_alt->m_object_key[2] == pi[2]) &&
01480           (m_alt->m_object_key[3] == pi[3])
01481          );
01482 }
01483 
01484 inline int64_t
01485 HTTPInfo::object_size_get()
01486 {
01487   int64_t val;
01488   int32_t* pi = reinterpret_cast<int32_t*>(&val);
01489 
01490   pi[0] = m_alt->m_object_size[0];
01491   pi[1] = m_alt->m_object_size[1];
01492   return val;
01493 }
01494 
01495 inline void
01496 HTTPInfo::object_key_set(INK_MD5 & md5)
01497 {
01498   int32_t* pi = reinterpret_cast<int32_t*>(&md5);
01499   m_alt->m_object_key[0] = pi[0];
01500   m_alt->m_object_key[1] = pi[1];
01501   m_alt->m_object_key[2] = pi[2];
01502   m_alt->m_object_key[3] = pi[3];
01503 }
01504 
01505 inline void
01506 HTTPInfo::object_size_set(int64_t size)
01507 {
01508   int32_t* pi = reinterpret_cast<int32_t*>(&size);
01509   m_alt->m_object_size[0] = pi[0];
01510   m_alt->m_object_size[1] = pi[1];
01511 }
01512 
01513 inline HTTPInfo::FragOffset*
01514 HTTPInfo::get_frag_table()
01515 {
01516   return m_alt ? m_alt->m_frag_offsets : 0;
01517 }
01518 
01519 inline int
01520 HTTPInfo::get_frag_offset_count() {
01521   return m_alt ? m_alt->m_frag_offset_count : 0;
01522 }
01523 
01524 
01525 #endif