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 __MIME_H__
00025 #define __MIME_H__
00026 
00027 #include <sys/time.h>
00028 
00029 #include "ink_assert.h"
00030 #include "ink_apidefs.h"
00031 #include "ink_string++.h"
00032 #include "HdrHeap.h"
00033 #include "HdrToken.h"
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 enum MIMEParseResult
00042 {
00043   PARSE_ERROR = -1,
00044   PARSE_DONE = 0,
00045   PARSE_OK = 1,
00046   PARSE_CONT = 2
00047 };
00048 
00049 enum
00050 {
00051   UNDEFINED_COUNT = -1
00052 };
00053 
00054 
00055 enum MimeParseState {
00056   MIME_PARSE_BEFORE, 
00057   MIME_PARSE_FOUND_CR, 
00058   MIME_PARSE_INSIDE, 
00059   MIME_PARSE_AFTER,  
00060 };
00061 
00062 #define MIME_SCANNER_TYPE_LINE                          0
00063 #define MIME_SCANNER_TYPE_FIELD                         1
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 #ifdef DEBUG
00072 #define MIME_HDR_SANITY_CHECK mime_hdr_sanity_check
00073 #else
00074 #define MIME_HDR_SANITY_CHECK (void)
00075 #endif
00076 
00077 #define MIME_FIELD_SLOT_READINESS_EMPTY         0
00078 #define MIME_FIELD_SLOT_READINESS_DETACHED      1
00079 #define MIME_FIELD_SLOT_READINESS_LIVE          2
00080 #define MIME_FIELD_SLOT_READINESS_DELETED       3
00081 
00082 #define MIME_FIELD_SLOT_FLAGS_DUP_HEAD          (1 << 0)
00083 #define MIME_FIELD_SLOT_FLAGS_COOKED            (1 << 1)
00084 
00085 #define MIME_FIELD_BLOCK_SLOTS                  16
00086 
00087 #define MIME_FIELD_SLOTNUM_BITS                 4
00088 #define MIME_FIELD_SLOTNUM_MASK                 ((1 << MIME_FIELD_SLOTNUM_BITS) - 1)
00089 #define MIME_FIELD_SLOTNUM_MAX                  (MIME_FIELD_SLOTNUM_MASK - 1)
00090 #define MIME_FIELD_SLOTNUM_UNKNOWN              MIME_FIELD_SLOTNUM_MAX
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098 struct MIMEHdrImpl;
00099 
00100 struct MIMEField
00101 {
00102   const char *m_ptr_name;       
00103   const char *m_ptr_value;      
00104   MIMEField *m_next_dup;        
00105   int16_t m_wks_idx;              
00106   uint16_t m_len_name;            
00107   uint32_t m_len_value:24;        
00108   uint8_t m_n_v_raw_printable:1;  
00109   uint8_t m_n_v_raw_printable_pad:3;      
00110   uint8_t m_readiness:2;          
00111   uint8_t m_flags:2;              
00112 
00113   bool is_dup_head() const {
00114     return (m_flags & MIME_FIELD_SLOT_FLAGS_DUP_HEAD);
00115   }
00116 
00117   bool is_cooked() {
00118     return (m_flags & MIME_FIELD_SLOT_FLAGS_COOKED);
00119   }
00120 
00121   bool is_live() const {
00122     return (m_readiness == MIME_FIELD_SLOT_READINESS_LIVE);
00123   }
00124 
00125   bool is_detached() const {
00126     return (m_readiness == MIME_FIELD_SLOT_READINESS_DETACHED);
00127   }
00128 
00129   bool supports_commas() const {
00130     if (m_wks_idx >= 0)
00131       return (hdrtoken_index_to_flags(m_wks_idx) & MIME_FLAGS_COMMAS);
00132     else
00133       return true;               
00134   }
00135 
00136   const char *name_get(int *length);
00137 
00138   const char *value_get(int *length);
00139   int32_t value_get_int();
00140   uint32_t value_get_uint();
00141   int64_t value_get_int64();
00142   time_t value_get_date();
00143   int value_get_comma_list(StrList * list);
00144 
00145   void name_set(HdrHeap * heap, MIMEHdrImpl * mh, const char *name, int length);
00146 
00147   void value_set(HdrHeap * heap, MIMEHdrImpl * mh, const char *value, int length);
00148   void value_set_int(HdrHeap * heap, MIMEHdrImpl * mh, int32_t value);
00149   void value_set_uint(HdrHeap * heap, MIMEHdrImpl * mh, uint32_t value);
00150   void value_set_int64(HdrHeap * heap, MIMEHdrImpl * mh, int64_t value);
00151   void value_set_date(HdrHeap * heap, MIMEHdrImpl * mh, time_t value);
00152   void value_clear(HdrHeap * heap, MIMEHdrImpl * mh);
00153   
00154   
00155   void value_append(HdrHeap * heap, MIMEHdrImpl * mh, const char *value,
00156                     int length, bool prepend_comma = false, const char separator = ',');
00157   int has_dups();
00158 };
00159 
00160 struct MIMEFieldBlockImpl:public HdrHeapObjImpl
00161 {
00162   
00163   uint32_t m_freetop;
00164   MIMEFieldBlockImpl *m_next;
00165   MIMEField m_field_slots[MIME_FIELD_BLOCK_SLOTS];
00166   
00167   
00168 
00169   
00170   int marshal(MarshalXlate * ptr_xlate, int num_ptr, MarshalXlate * str_xlate, int num_str);
00171   void unmarshal(intptr_t offset);
00172   void move_strings(HdrStrHeap * new_heap);
00173   size_t strings_length();
00174 
00175   
00176   void check_strings(HeapCheck * heaps, int num_heaps);
00177 };
00178 
00179 
00180 
00181 
00182 
00183 
00184 
00185 enum MIMECookedMask
00186 {
00187   MIME_COOKED_MASK_CC_MAX_AGE = (1 << 0),
00188   MIME_COOKED_MASK_CC_NO_CACHE = (1 << 1),
00189   MIME_COOKED_MASK_CC_NO_STORE = (1 << 2),
00190   MIME_COOKED_MASK_CC_NO_TRANSFORM = (1 << 3),
00191   MIME_COOKED_MASK_CC_MAX_STALE = (1 << 4),
00192   MIME_COOKED_MASK_CC_MIN_FRESH = (1 << 5),
00193   MIME_COOKED_MASK_CC_ONLY_IF_CACHED = (1 << 6),
00194   MIME_COOKED_MASK_CC_PUBLIC = (1 << 7),
00195   MIME_COOKED_MASK_CC_PRIVATE = (1 << 8),
00196   MIME_COOKED_MASK_CC_MUST_REVALIDATE = (1 << 9),
00197   MIME_COOKED_MASK_CC_PROXY_REVALIDATE = (1 << 10),
00198   MIME_COOKED_MASK_CC_S_MAXAGE = (1 << 11),
00199   MIME_COOKED_MASK_CC_NEED_REVALIDATE_ONCE = (1 << 12),
00200   MIME_COOKED_MASK_CC_EXTENSION = (1 << 13)
00201 };
00202 
00203 struct MIMECookedCacheControl
00204 {
00205   uint32_t m_mask;
00206   int32_t m_secs_max_age;
00207   int32_t m_secs_s_maxage;
00208   int32_t m_secs_max_stale;
00209   int32_t m_secs_min_fresh;
00210 };
00211 
00212 struct MIMECookedPragma
00213 {
00214   bool m_no_cache;
00215 };
00216 
00217 struct MIMECooked
00218 {
00219   MIMECookedCacheControl m_cache_control;
00220   MIMECookedPragma m_pragma;
00221 };
00222 
00223 
00224 
00225 
00226 
00227 
00228 
00229 struct MIMEHdrImpl:public HdrHeapObjImpl
00230 {
00231   
00232   uint64_t m_presence_bits;
00233   uint32_t m_slot_accelerators[4];
00234 
00235   MIMECooked m_cooked_stuff;
00236 
00237   MIMEFieldBlockImpl *m_fblock_list_tail;
00238   MIMEFieldBlockImpl m_first_fblock;    
00239   
00240   
00241 
00242   
00243   int marshal(MarshalXlate * ptr_xlate, int num_ptr, MarshalXlate * str_xlate, int num_str);
00244   void unmarshal(intptr_t offset);
00245   void move_strings(HdrStrHeap * new_heap);
00246   size_t strings_length();
00247 
00248   
00249   void check_strings(HeapCheck * heaps, int num_heaps);
00250 
00251   
00252   void recompute_cooked_stuff(MIMEField * changing_field_or_null = NULL);
00253   void recompute_accelerators_and_presence_bits();
00254 };
00255 
00256 
00257 
00258 
00259 
00260 
00261 
00262 struct MIMEScanner
00263 {
00264   char *m_line;                 
00265   
00266   int m_line_length;            
00267   int m_line_size;              
00268 
00269   MimeParseState m_state; 
00270 };
00271 
00272 
00273 struct MIMEParser
00274 {
00275   MIMEScanner m_scanner;
00276   int32_t m_field;
00277   int m_field_flags;
00278   int m_value;
00279 };
00280 
00281 
00282 
00283 
00284 
00285 
00286 
00287 
00288 
00289 
00290 struct MIMEFieldSDKHandle:public HdrHeapObjImpl
00291 {
00292   MIMEHdrImpl *mh;
00293   MIMEField *field_ptr;
00294 };
00295 
00296 
00297 
00298 
00299 
00300 
00301 
00302 extern const char *MIME_FIELD_ACCEPT;
00303 extern const char *MIME_FIELD_ACCEPT_CHARSET;
00304 extern const char *MIME_FIELD_ACCEPT_ENCODING;
00305 extern const char *MIME_FIELD_ACCEPT_LANGUAGE;
00306 extern const char *MIME_FIELD_ACCEPT_RANGES;
00307 extern const char *MIME_FIELD_AGE;
00308 extern const char *MIME_FIELD_ALLOW;
00309 extern const char *MIME_FIELD_APPROVED;
00310 extern const char *MIME_FIELD_AUTHORIZATION;
00311 extern const char *MIME_FIELD_BYTES;
00312 extern const char *MIME_FIELD_CACHE_CONTROL;
00313 extern const char *MIME_FIELD_CLIENT_IP;
00314 extern const char *MIME_FIELD_CONNECTION;
00315 extern const char *MIME_FIELD_CONTENT_BASE;
00316 extern const char *MIME_FIELD_CONTENT_ENCODING;
00317 extern const char *MIME_FIELD_CONTENT_LANGUAGE;
00318 extern const char *MIME_FIELD_CONTENT_LENGTH;
00319 extern const char *MIME_FIELD_CONTENT_LOCATION;
00320 extern const char *MIME_FIELD_CONTENT_MD5;
00321 extern const char *MIME_FIELD_CONTENT_RANGE;
00322 extern const char *MIME_FIELD_CONTENT_TYPE;
00323 extern const char *MIME_FIELD_CONTROL;
00324 extern const char *MIME_FIELD_COOKIE;
00325 extern const char *MIME_FIELD_DATE;
00326 extern const char *MIME_FIELD_DISTRIBUTION;
00327 extern const char *MIME_FIELD_ETAG;
00328 extern const char *MIME_FIELD_EXPECT;
00329 extern const char *MIME_FIELD_EXPIRES;
00330 extern const char *MIME_FIELD_FOLLOWUP_TO;
00331 extern const char *MIME_FIELD_FROM;
00332 extern const char *MIME_FIELD_HOST;
00333 extern const char *MIME_FIELD_IF_MATCH;
00334 extern const char *MIME_FIELD_IF_MODIFIED_SINCE;
00335 extern const char *MIME_FIELD_IF_NONE_MATCH;
00336 extern const char *MIME_FIELD_IF_RANGE;
00337 extern const char *MIME_FIELD_IF_UNMODIFIED_SINCE;
00338 extern const char *MIME_FIELD_KEEP_ALIVE;
00339 extern const char *MIME_FIELD_KEYWORDS;
00340 extern const char *MIME_FIELD_LAST_MODIFIED;
00341 extern const char *MIME_FIELD_LINES;
00342 inkcoreapi extern const char *MIME_FIELD_LOCATION;
00343 extern const char *MIME_FIELD_MAX_FORWARDS;
00344 extern const char *MIME_FIELD_MESSAGE_ID;
00345 extern const char *MIME_FIELD_NEWSGROUPS;
00346 extern const char *MIME_FIELD_ORGANIZATION;
00347 extern const char *MIME_FIELD_PATH;
00348 extern const char *MIME_FIELD_PRAGMA;
00349 extern const char *MIME_FIELD_PROXY_AUTHENTICATE;
00350 extern const char *MIME_FIELD_PROXY_AUTHORIZATION;
00351 extern const char *MIME_FIELD_PROXY_CONNECTION;
00352 extern const char *MIME_FIELD_PUBLIC;
00353 extern const char *MIME_FIELD_RANGE;
00354 extern const char *MIME_FIELD_REFERENCES;
00355 extern const char *MIME_FIELD_REFERER;
00356 extern const char *MIME_FIELD_REPLY_TO;
00357 extern const char *MIME_FIELD_RETRY_AFTER;
00358 extern const char *MIME_FIELD_SENDER;
00359 extern const char *MIME_FIELD_SERVER;
00360 extern const char *MIME_FIELD_SET_COOKIE;
00361 extern const char *MIME_FIELD_STRICT_TRANSPORT_SECURITY;
00362 extern const char *MIME_FIELD_SUBJECT;
00363 extern const char *MIME_FIELD_SUMMARY;
00364 extern const char *MIME_FIELD_TE;
00365 extern const char *MIME_FIELD_TRANSFER_ENCODING;
00366 extern const char *MIME_FIELD_UPGRADE;
00367 extern const char *MIME_FIELD_USER_AGENT;
00368 extern const char *MIME_FIELD_VARY;
00369 extern const char *MIME_FIELD_VIA;
00370 extern const char *MIME_FIELD_WARNING;
00371 extern const char *MIME_FIELD_WWW_AUTHENTICATE;
00372 extern const char *MIME_FIELD_XREF;
00373 extern const char *MIME_FIELD_INT_DATA_INFO;
00374 extern const char *MIME_FIELD_X_ID;
00375 extern const char *MIME_FIELD_X_FORWARDED_FOR;
00376 extern const char *MIME_FIELD_SEC_WEBSOCKET_KEY;
00377 extern const char *MIME_FIELD_SEC_WEBSOCKET_VERSION;
00378 
00379 extern const char *MIME_VALUE_BYTES;
00380 extern const char *MIME_VALUE_CHUNKED;
00381 extern const char *MIME_VALUE_CLOSE;
00382 extern const char *MIME_VALUE_COMPRESS;
00383 extern const char *MIME_VALUE_DEFLATE;
00384 extern const char *MIME_VALUE_GZIP;
00385 extern const char *MIME_VALUE_IDENTITY;
00386 extern const char *MIME_VALUE_KEEP_ALIVE;
00387 extern const char *MIME_VALUE_MAX_AGE;
00388 extern const char *MIME_VALUE_MAX_STALE;
00389 extern const char *MIME_VALUE_MIN_FRESH;
00390 extern const char *MIME_VALUE_MUST_REVALIDATE;
00391 extern const char *MIME_VALUE_NONE;
00392 extern const char *MIME_VALUE_NO_CACHE;
00393 extern const char *MIME_VALUE_NO_STORE;
00394 extern const char *MIME_VALUE_NO_TRANSFORM;
00395 extern const char *MIME_VALUE_ONLY_IF_CACHED;
00396 extern const char *MIME_VALUE_PRIVATE;
00397 extern const char *MIME_VALUE_PROXY_REVALIDATE;
00398 extern const char *MIME_VALUE_PUBLIC;
00399 extern const char *MIME_VALUE_S_MAXAGE;
00400 extern const char *MIME_VALUE_NEED_REVALIDATE_ONCE;
00401 extern const char *MIME_VALUE_WEBSOCKET;
00402 
00403 extern int MIME_LEN_ACCEPT;
00404 extern int MIME_LEN_ACCEPT_CHARSET;
00405 extern int MIME_LEN_ACCEPT_ENCODING;
00406 extern int MIME_LEN_ACCEPT_LANGUAGE;
00407 extern int MIME_LEN_ACCEPT_RANGES;
00408 extern int MIME_LEN_AGE;
00409 extern int MIME_LEN_ALLOW;
00410 extern int MIME_LEN_APPROVED;
00411 extern int MIME_LEN_AUTHORIZATION;
00412 extern int MIME_LEN_BYTES;
00413 extern int MIME_LEN_CACHE_CONTROL;
00414 extern int MIME_LEN_CLIENT_IP;
00415 extern int MIME_LEN_CONNECTION;
00416 extern int MIME_LEN_CONTENT_BASE;
00417 extern int MIME_LEN_CONTENT_ENCODING;
00418 extern int MIME_LEN_CONTENT_LANGUAGE;
00419 extern int MIME_LEN_CONTENT_LENGTH;
00420 extern int MIME_LEN_CONTENT_LOCATION;
00421 extern int MIME_LEN_CONTENT_MD5;
00422 extern int MIME_LEN_CONTENT_RANGE;
00423 extern int MIME_LEN_CONTENT_TYPE;
00424 extern int MIME_LEN_CONTROL;
00425 extern int MIME_LEN_COOKIE;
00426 extern int MIME_LEN_DATE;
00427 extern int MIME_LEN_DISTRIBUTION;
00428 extern int MIME_LEN_ETAG;
00429 extern int MIME_LEN_EXPECT;
00430 extern int MIME_LEN_EXPIRES;
00431 extern int MIME_LEN_FOLLOWUP_TO;
00432 extern int MIME_LEN_FROM;
00433 extern int MIME_LEN_HOST;
00434 extern int MIME_LEN_IF_MATCH;
00435 extern int MIME_LEN_IF_MODIFIED_SINCE;
00436 extern int MIME_LEN_IF_NONE_MATCH;
00437 extern int MIME_LEN_IF_RANGE;
00438 extern int MIME_LEN_IF_UNMODIFIED_SINCE;
00439 extern int MIME_LEN_KEEP_ALIVE;
00440 extern int MIME_LEN_KEYWORDS;
00441 extern int MIME_LEN_LAST_MODIFIED;
00442 extern int MIME_LEN_LINES;
00443 inkcoreapi extern int MIME_LEN_LOCATION;
00444 extern int MIME_LEN_MAX_FORWARDS;
00445 extern int MIME_LEN_MESSAGE_ID;
00446 extern int MIME_LEN_NEWSGROUPS;
00447 extern int MIME_LEN_ORGANIZATION;
00448 extern int MIME_LEN_PATH;
00449 extern int MIME_LEN_PRAGMA;
00450 extern int MIME_LEN_PROXY_AUTHENTICATE;
00451 extern int MIME_LEN_PROXY_AUTHORIZATION;
00452 extern int MIME_LEN_PROXY_CONNECTION;
00453 extern int MIME_LEN_PUBLIC;
00454 extern int MIME_LEN_RANGE;
00455 extern int MIME_LEN_REFERENCES;
00456 extern int MIME_LEN_REFERER;
00457 extern int MIME_LEN_REPLY_TO;
00458 extern int MIME_LEN_RETRY_AFTER;
00459 extern int MIME_LEN_SENDER;
00460 extern int MIME_LEN_SERVER;
00461 extern int MIME_LEN_SET_COOKIE;
00462 extern int MIME_LEN_STRICT_TRANSPORT_SECURITY;
00463 extern int MIME_LEN_SUBJECT;
00464 extern int MIME_LEN_SUMMARY;
00465 extern int MIME_LEN_TE;
00466 extern int MIME_LEN_TRANSFER_ENCODING;
00467 extern int MIME_LEN_UPGRADE;
00468 extern int MIME_LEN_USER_AGENT;
00469 extern int MIME_LEN_VARY;
00470 extern int MIME_LEN_VIA;
00471 extern int MIME_LEN_WARNING;
00472 extern int MIME_LEN_WWW_AUTHENTICATE;
00473 extern int MIME_LEN_XREF;
00474 extern int MIME_LEN_INT_DATA_INFO;
00475 extern int MIME_LEN_X_ID;
00476 extern int MIME_LEN_X_FORWARDED_FOR;
00477 
00478 extern int MIME_LEN_BYTES;
00479 extern int MIME_LEN_CHUNKED;
00480 extern int MIME_LEN_CLOSE;
00481 extern int MIME_LEN_COMPRESS;
00482 extern int MIME_LEN_DEFLATE;
00483 extern int MIME_LEN_GZIP;
00484 extern int MIME_LEN_IDENTITY;
00485 extern int MIME_LEN_KEEP_ALIVE;
00486 extern int MIME_LEN_MAX_AGE;
00487 extern int MIME_LEN_MAX_STALE;
00488 extern int MIME_LEN_MIN_FRESH;
00489 extern int MIME_LEN_MUST_REVALIDATE;
00490 extern int MIME_LEN_NONE;
00491 extern int MIME_LEN_NO_CACHE;
00492 extern int MIME_LEN_NO_STORE;
00493 extern int MIME_LEN_NO_TRANSFORM;
00494 extern int MIME_LEN_ONLY_IF_CACHED;
00495 extern int MIME_LEN_PRIVATE;
00496 extern int MIME_LEN_PROXY_REVALIDATE;
00497 extern int MIME_LEN_PUBLIC;
00498 extern int MIME_LEN_S_MAXAGE;
00499 extern int MIME_LEN_NEED_REVALIDATE_ONCE;
00500 
00501 extern int MIME_LEN_SEC_WEBSOCKET_KEY;
00502 extern int MIME_LEN_SEC_WEBSOCKET_VERSION;
00503 
00504 extern int MIME_WKSIDX_ACCEPT;
00505 extern int MIME_WKSIDX_ACCEPT_CHARSET;
00506 extern int MIME_WKSIDX_ACCEPT_ENCODING;
00507 extern int MIME_WKSIDX_ACCEPT_LANGUAGE;
00508 extern int MIME_WKSIDX_ACCEPT_RANGES;
00509 extern int MIME_WKSIDX_AGE;
00510 extern int MIME_WKSIDX_ALLOW;
00511 extern int MIME_WKSIDX_APPROVED;
00512 extern int MIME_WKSIDX_AUTHORIZATION;
00513 extern int MIME_WKSIDX_BYTES;
00514 extern int MIME_WKSIDX_CACHE_CONTROL;
00515 extern int MIME_WKSIDX_CLIENT_IP;
00516 extern int MIME_WKSIDX_CONNECTION;
00517 extern int MIME_WKSIDX_CONTENT_BASE;
00518 extern int MIME_WKSIDX_CONTENT_ENCODING;
00519 extern int MIME_WKSIDX_CONTENT_LANGUAGE;
00520 extern int MIME_WKSIDX_CONTENT_LENGTH;
00521 extern int MIME_WKSIDX_CONTENT_LOCATION;
00522 extern int MIME_WKSIDX_CONTENT_MD5;
00523 extern int MIME_WKSIDX_CONTENT_RANGE;
00524 extern int MIME_WKSIDX_CONTENT_TYPE;
00525 extern int MIME_WKSIDX_CONTROL;
00526 extern int MIME_WKSIDX_COOKIE;
00527 extern int MIME_WKSIDX_DATE;
00528 extern int MIME_WKSIDX_DISTRIBUTION;
00529 extern int MIME_WKSIDX_ETAG;
00530 extern int MIME_WKSIDX_EXPECT;
00531 extern int MIME_WKSIDX_EXPIRES;
00532 extern int MIME_WKSIDX_FOLLOWUP_TO;
00533 extern int MIME_WKSIDX_FROM;
00534 extern int MIME_WKSIDX_HOST;
00535 extern int MIME_WKSIDX_IF_MATCH;
00536 extern int MIME_WKSIDX_IF_MODIFIED_SINCE;
00537 extern int MIME_WKSIDX_IF_NONE_MATCH;
00538 extern int MIME_WKSIDX_IF_RANGE;
00539 extern int MIME_WKSIDX_IF_UNMODIFIED_SINCE;
00540 extern int MIME_WKSIDX_KEEP_ALIVE;
00541 extern int MIME_WKSIDX_KEYWORDS;
00542 extern int MIME_WKSIDX_LAST_MODIFIED;
00543 extern int MIME_WKSIDX_LINES;
00544 extern int MIME_WKSIDX_LOCATION;
00545 extern int MIME_WKSIDX_MAX_FORWARDS;
00546 extern int MIME_WKSIDX_MESSAGE_ID;
00547 extern int MIME_WKSIDX_NEWSGROUPS;
00548 extern int MIME_WKSIDX_ORGANIZATION;
00549 extern int MIME_WKSIDX_PATH;
00550 extern int MIME_WKSIDX_PRAGMA;
00551 extern int MIME_WKSIDX_PROXY_AUTHENTICATE;
00552 extern int MIME_WKSIDX_PROXY_AUTHORIZATION;
00553 extern int MIME_WKSIDX_PROXY_CONNECTION;
00554 extern int MIME_WKSIDX_PUBLIC;
00555 extern int MIME_WKSIDX_RANGE;
00556 extern int MIME_WKSIDX_REFERENCES;
00557 extern int MIME_WKSIDX_REFERER;
00558 extern int MIME_WKSIDX_REPLY_TO;
00559 extern int MIME_WKSIDX_RETRY_AFTER;
00560 extern int MIME_WKSIDX_SENDER;
00561 extern int MIME_WKSIDX_SERVER;
00562 extern int MIME_WKSIDX_SET_COOKIE;
00563 extern int MIME_WKSIDX_STRICT_TRANSPORT_SECURITY;
00564 extern int MIME_WKSIDX_SUBJECT;
00565 extern int MIME_WKSIDX_SUMMARY;
00566 extern int MIME_WKSIDX_TE;
00567 extern int MIME_WKSIDX_TRANSFER_ENCODING;
00568 extern int MIME_WKSIDX_UPGRADE;
00569 extern int MIME_WKSIDX_USER_AGENT;
00570 extern int MIME_WKSIDX_VARY;
00571 extern int MIME_WKSIDX_VIA;
00572 extern int MIME_WKSIDX_WARNING;
00573 extern int MIME_WKSIDX_WWW_AUTHENTICATE;
00574 extern int MIME_WKSIDX_XREF;
00575 extern int MIME_WKSIDX_INT_DATA_INFO;
00576 extern int MIME_WKSIDX_X_ID;
00577 extern int MIME_WKSIDX_SEC_WEBSOCKET_KEY;
00578 extern int MIME_WKSIDX_SEC_WEBSOCKET_VERSION;
00579 
00580 
00581 
00582 
00583 
00584 
00585 
00586 uint64_t mime_field_presence_mask(const char *well_known_str);
00587 uint64_t mime_field_presence_mask(int well_known_str_index);
00588 int mime_field_presence_get(MIMEHdrImpl * h, const char *well_known_str);
00589 int mime_field_presence_get(MIMEHdrImpl * h, int well_known_str_index);
00590 void mime_hdr_presence_set(MIMEHdrImpl * h, const char *well_known_str);
00591 void mime_hdr_presence_set(MIMEHdrImpl * h, int well_known_str_index);
00592 void mime_hdr_presence_unset(MIMEHdrImpl * h, const char *well_known_str);
00593 void mime_hdr_presence_unset(MIMEHdrImpl * h, int well_known_str_index);
00594 
00595 void mime_hdr_sanity_check(MIMEHdrImpl * mh);
00596 
00597 void mime_init();
00598 void mime_init_cache_control_cooking_masks();
00599 void mime_init_date_format_table();
00600 
00601 MIMEHdrImpl *mime_hdr_create(HdrHeap * heap);
00602 void _mime_hdr_field_block_init(MIMEFieldBlockImpl * fblock);
00603 void mime_hdr_cooked_stuff_init(MIMEHdrImpl * mh, MIMEField * changing_field_or_null = NULL);
00604 void mime_hdr_init(MIMEHdrImpl * mh);
00605 MIMEFieldBlockImpl *_mime_field_block_copy(MIMEFieldBlockImpl * s_fblock, HdrHeap * s_heap, HdrHeap * d_heap);
00606 void _mime_field_block_destroy(HdrHeap * heap, MIMEFieldBlockImpl * fblock);
00607 void mime_hdr_destroy_field_block_list(HdrHeap * heap, MIMEFieldBlockImpl * head);
00608 void mime_hdr_destroy(HdrHeap * heap, MIMEHdrImpl * mh);
00609 void mime_hdr_copy_onto(MIMEHdrImpl * s_mh, HdrHeap * s_heap,
00610                         MIMEHdrImpl * d_mh, HdrHeap * d_heap, bool inherit_strs = true);
00611 MIMEHdrImpl *mime_hdr_clone(MIMEHdrImpl * s_mh, HdrHeap * s_heap, HdrHeap * d_heap, bool inherit_strs = true);
00612 void mime_hdr_field_block_list_adjust(int block_count, MIMEFieldBlockImpl * old_list, MIMEFieldBlockImpl * new_list);
00613 int mime_hdr_length_get(MIMEHdrImpl * mh);
00614 
00615 void mime_hdr_fields_clear(HdrHeap * heap, MIMEHdrImpl * mh);
00616 
00617 MIMEField *_mime_hdr_field_list_search_by_wks(MIMEHdrImpl * mh, int wks_idx);
00618 MIMEField *_mime_hdr_field_list_search_by_string(MIMEHdrImpl * mh, const char *field_name_str, int field_name_len);
00619 MIMEField *_mime_hdr_field_list_search_by_slotnum(MIMEHdrImpl * mh, int slotnum);
00620 inkcoreapi MIMEField *mime_hdr_field_find(MIMEHdrImpl * mh, const char *field_name_str, int field_name_len);
00621 
00622 MIMEField *mime_hdr_field_get(MIMEHdrImpl * mh, int idx);
00623 MIMEField *mime_hdr_field_get_slotnum(MIMEHdrImpl * mh, int slotnum);
00624 int mime_hdr_fields_count(MIMEHdrImpl * mh);
00625 
00626 void mime_field_init(MIMEField * field);
00627 MIMEField *mime_field_create(HdrHeap * heap, MIMEHdrImpl * mh);
00628 MIMEField *mime_field_create_named(HdrHeap * heap, MIMEHdrImpl * mh, const char *name, int length);
00629 
00630 void mime_hdr_field_attach(MIMEHdrImpl * mh, MIMEField * field, int check_for_dups, MIMEField * prev_dup);
00631 void mime_hdr_field_detach(MIMEHdrImpl * mh, MIMEField * field, bool detach_all_dups = false);
00632 void mime_hdr_field_delete(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, bool delete_all_dups = false);
00633 
00634 int mime_hdr_field_slotnum(MIMEHdrImpl * mh, MIMEField * field);
00635 inkcoreapi MIMEField *mime_hdr_prepare_for_value_set(HdrHeap * heap, MIMEHdrImpl * mh, const char *name,
00636                                                      int name_length);
00637 
00638 void mime_field_destroy(MIMEHdrImpl * mh, MIMEField * field);
00639 
00640 const char *mime_field_name_get(MIMEField * field, int *length);
00641 void mime_field_name_set(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field,
00642                          int16_t name_wks_idx_or_neg1, const char *name, int length, bool must_copy_string);
00643 
00644 inkcoreapi const char *mime_field_value_get(MIMEField * field, int *length);
00645 int32_t mime_field_value_get_int(MIMEField * field);
00646 uint32_t mime_field_value_get_uint(MIMEField * field);
00647 int64_t mime_field_value_get_int64(MIMEField * field);
00648 time_t mime_field_value_get_date(MIMEField * field);
00649 const char *mime_field_value_get_comma_val(MIMEField * field, int *length, int idx);
00650 int mime_field_value_get_comma_val_count(MIMEField * field);
00651 int mime_field_value_get_comma_list(MIMEField * field, StrList * list);
00652 
00653 void mime_field_value_set_comma_val(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, int idx,
00654                                     const char *new_piece_str, int new_piece_len);
00655 void mime_field_value_delete_comma_val(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, int idx);
00656 void mime_field_value_extend_comma_val(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, int idx,
00657                                        const char *new_piece_str, int new_piece_len);
00658 void mime_field_value_insert_comma_val(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, int idx,
00659                                        const char *new_piece_str, int new_piece_len);
00660 
00661 inkcoreapi void mime_field_value_set(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field,
00662                                      const char *value, int length, bool must_copy_string);
00663 void mime_field_value_set_int(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, int32_t value);
00664 void mime_field_value_set_uint(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, uint32_t value);
00665 void mime_field_value_set_int64(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, int64_t value);
00666 void mime_field_value_set_date(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field, time_t value);
00667 void mime_field_name_value_set(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field,
00668                                int16_t name_wks_idx_or_neg1, const char *name,
00669                                int name_length, const char *value,
00670                                int value_length, int n_v_raw_printable, int n_v_raw_length, bool must_copy_strings);
00671 
00672 void mime_field_value_append(HdrHeap * heap, MIMEHdrImpl * mh, MIMEField * field,
00673                              const char *value, int length, bool prepend_comma, const char separator);
00674 
00675 void mime_scanner_init(MIMEScanner * scanner);
00676 void mime_scanner_clear(MIMEScanner * scanner);
00677 void mime_scanner_append(MIMEScanner * scanner, const char *data, int data_size);
00678 MIMEParseResult mime_scanner_get(MIMEScanner * S, const char **raw_input_s, const char *raw_input_e,
00679                                  const char **output_s, const char **output_e,
00680                                  bool * output_shares_raw_input, bool raw_input_eof, int raw_input_scan_type);
00681 
00682 void mime_parser_init(MIMEParser * parser);
00683 void mime_parser_clear(MIMEParser * parser);
00684 MIMEParseResult mime_parser_parse(MIMEParser * parser, HdrHeap * heap, MIMEHdrImpl * mh,
00685                                   const char **real_s, const char *real_e, bool must_copy_strings, bool eof);
00686 
00687 void mime_hdr_describe(HdrHeapObjImpl * raw, bool recurse);
00688 void mime_field_block_describe(HdrHeapObjImpl * raw, bool recurse);
00689 
00690 int mime_hdr_print(HdrHeap * heap, MIMEHdrImpl * mh, char *buf_start,
00691                    int buf_length, int *buf_index_inout, int *buf_chars_to_skip_inout);
00692 int mime_mem_print(const char *src_d, int src_l, char *buf_start, int buf_length,
00693                    int *buf_index_inout, int *buf_chars_to_skip_inout);
00694 int mime_field_print(MIMEField * field, char *buf_start, int buf_length,
00695                      int *buf_index_inout, int *buf_chars_to_skip_inout);
00696 
00697 const char *mime_str_u16_set(HdrHeap * heap, const char *s_str, int s_len,
00698                              const char **d_str, uint16_t * d_len, bool must_copy);
00699 
00700 int mime_field_length_get(MIMEField * field);
00701 int mime_format_int(char *buf, int32_t val, size_t buf_len);
00702 int mime_format_uint(char *buf, uint32_t val, size_t buf_len);
00703 int mime_format_int64(char *buf, int64_t val, size_t buf_len);
00704 
00705 void mime_days_since_epoch_to_mdy_slowcase(unsigned int days_since_jan_1_1970,
00706                                            int *m_return, int *d_return, int *y_return);
00707 void mime_days_since_epoch_to_mdy(unsigned int days_since_jan_1_1970, int *m_return, int *d_return, int *y_return);
00708 int mime_format_date(char *buffer, time_t value);
00709 
00710 int32_t mime_parse_int(const char *buf, const char *end = NULL);
00711 uint32_t mime_parse_uint(const char *buf, const char *end = NULL);
00712 int64_t mime_parse_int64(const char *buf, const char *end = NULL);
00713 int mime_parse_rfc822_date_fastcase(const char *buf, int length, struct tm *tp);
00714 time_t mime_parse_date(const char *buf, const char *end = NULL);
00715 int mime_parse_day(const char *&buf, const char *end, int *day);
00716 int mime_parse_month(const char *&buf, const char *end, int *month);
00717 int mime_parse_mday(const char *&buf, const char *end, int *mday);
00718 int mime_parse_year(const char *&buf, const char *end, int *year);
00719 int mime_parse_time(const char *&buf, const char *end, int *hour, int *min, int *sec);
00720 int mime_parse_integer(const char *&buf, const char *end, int *integer);
00721 
00722 
00723 
00724 
00725 
00726 
00727 
00728 
00729 
00730 
00731 inline const char *
00732 MIMEField::name_get(int *length)
00733 {
00734   return (mime_field_name_get(this, length));
00735 }
00736 
00737 
00738 
00739 
00740 inline void
00741 MIMEField::name_set(HdrHeap * heap, MIMEHdrImpl * mh, const char *name, int length)
00742 {
00743   int16_t name_wks_idx;
00744   const char *name_wks;
00745 
00746   if (hdrtoken_is_wks(name)) {
00747     name_wks_idx = hdrtoken_wks_to_index(name);
00748     mime_field_name_set(heap, mh, this, name_wks_idx, name, length, 1);
00749   } else {
00750     int field_name_wks_idx = hdrtoken_tokenize(name, length, &name_wks);
00751     mime_field_name_set(heap, mh, this, field_name_wks_idx, (field_name_wks_idx == -1 ? name : name_wks), length, 1);
00752   }
00753 }
00754 
00755 
00756 
00757 
00758 inline const char *
00759 MIMEField::value_get(int *length)
00760 {
00761   return (mime_field_value_get(this, length));
00762 }
00763 
00764 inline int32_t
00765 MIMEField::value_get_int()
00766 {
00767   return (mime_field_value_get_int(this));
00768 }
00769 
00770 inline uint32_t
00771 MIMEField::value_get_uint()
00772 {
00773   return (mime_field_value_get_uint(this));
00774 }
00775 
00776 inline int64_t
00777 MIMEField::value_get_int64()
00778 {
00779   return (mime_field_value_get_int64(this));
00780 }
00781 
00782 inline time_t
00783 MIMEField::value_get_date()
00784 {
00785   return (mime_field_value_get_date(this));
00786 }
00787 
00788 inline int
00789 MIMEField::value_get_comma_list(StrList * list)
00790 {
00791   return (mime_field_value_get_comma_list(this, list));
00792 }
00793 
00794 
00795 
00796 
00797 inline void
00798 MIMEField::value_set(HdrHeap * heap, MIMEHdrImpl * mh, const char *value, int length)
00799 {
00800   mime_field_value_set(heap, mh, this, value, length, 1);
00801 }
00802 
00803 inline void
00804 MIMEField::value_set_int(HdrHeap * heap, MIMEHdrImpl * mh, int32_t value)
00805 {
00806   mime_field_value_set_int(heap, mh, this, value);
00807 }
00808 
00809 inline void
00810 MIMEField::value_set_uint(HdrHeap * heap, MIMEHdrImpl * mh, uint32_t value)
00811 {
00812   mime_field_value_set_uint(heap, mh, this, value);
00813 }
00814 
00815 inline void
00816 MIMEField::value_set_int64(HdrHeap * heap, MIMEHdrImpl * mh, int64_t value)
00817 {
00818   mime_field_value_set_int64(heap, mh, this, value);
00819 }
00820 
00821 inline void
00822 MIMEField::value_set_date(HdrHeap * heap, MIMEHdrImpl * mh, time_t value)
00823 {
00824   mime_field_value_set_date(heap, mh, this, value);
00825 }
00826 
00827 
00828 
00829 
00830 inline void
00831 MIMEField::value_clear(HdrHeap * heap, MIMEHdrImpl * mh)
00832 {
00833   value_set(heap, mh, "", 0);
00834 }
00835 
00836 
00837 
00838 
00839 inline void
00840 MIMEField::value_append(HdrHeap * heap, MIMEHdrImpl * mh, const char *value,
00841                         int length, bool prepend_comma, const char separator)
00842 {
00843   mime_field_value_append(heap, mh, this, value, length, prepend_comma, separator);
00844 }
00845 
00846 inline int
00847 MIMEField::has_dups()
00848 {
00849   return (m_next_dup != NULL);
00850 }
00851 
00852 
00853 
00854 
00855 
00856 
00857 
00858 struct MIMEFieldIter
00859 {
00860   uint32_t m_slot;
00861   MIMEFieldBlockImpl *m_block;
00862 };
00863 
00864 
00865 
00866 
00867 
00868 
00869 
00870 
00871 
00872 
00873 class MIMEHdr:public HdrHeapSDKHandle
00874 {
00875 public:
00876 
00877   MIMEHdrImpl * m_mime;
00878 
00879   MIMEHdr();
00880   ~MIMEHdr();
00881 
00882   int valid() const;
00883 
00884   void create(HdrHeap * heap = NULL);
00885   void copy(const MIMEHdr * hdr);
00886 
00887   int length_get();
00888 
00889   void fields_clear();
00890   int fields_count();
00891 
00892   MIMEField *field_create(const char *name = NULL, int length = -1);
00893   MIMEField *field_find(const char *name, int length);
00894   void field_attach(MIMEField * field);
00895   void field_detach(MIMEField * field, bool detach_all_dups = true);
00896   void field_delete(MIMEField * field, bool delete_all_dups = true);
00897   void field_delete(const char *name, int name_length);
00898 
00899   MIMEField *iter_get_first(MIMEFieldIter * iter);
00900   MIMEField *iter_get_next(MIMEFieldIter * iter);
00901 
00902   uint64_t presence(uint64_t mask);
00903 
00904   int print(char *buf, int bufsize, int *bufindex, int *chars_to_skip);
00905 
00906   int parse(MIMEParser * parser, const char **start, const char *end, bool must_copy_strs, bool eof);
00907 
00908   const char *value_get(const char *name, int name_length, int *value_length);
00909   int32_t value_get_int(const char *name, int name_length);
00910   uint32_t value_get_uint(const char *name, int name_length);
00911   int64_t value_get_int64(const char *name, int name_length);
00912   time_t value_get_date(const char *name, int name_length);
00913   int value_get_comma_list(const char *name, int name_length, StrList * list);
00914 
00915   void value_set(const char *name, int name_length, const char *value, int value_length);
00916   void value_set_int(const char *name, int name_length, int32_t value);
00917   void value_set_uint(const char *name, int name_length, uint32_t value);
00918   void value_set_int64(const char *name, int name_length, int64_t value);
00919   void value_set_date(const char *name, int name_length, time_t value);
00920   
00921   
00922   void value_append(const char *name, int name_length,
00923                     const char *value, int value_length, bool prepend_comma = false, const char separator = ',');
00924 
00925   void field_value_set(MIMEField * field, const char *value, int value_length);
00926   void field_value_set_int(MIMEField * field, int32_t value);
00927   void field_value_set_uint(MIMEField * field, uint32_t value);
00928   void field_value_set_int64(MIMEField * field, int64_t value);
00929   void field_value_set_date(MIMEField * field, time_t value);
00930   
00931   
00932   void field_value_append(MIMEField * field,
00933                           const char *value, int value_length, bool prepend_comma = false, const char separator = ',');
00934   time_t get_age();
00935   int64_t get_content_length();
00936   time_t get_date();
00937   time_t get_expires();
00938   time_t get_if_modified_since();
00939   time_t get_if_unmodified_since();
00940   time_t get_last_modified();
00941   time_t get_if_range_date();
00942   int32_t get_max_forwards();
00943   int32_t get_warning(int idx = 0);
00944 
00945   uint32_t get_cooked_cc_mask();
00946   int32_t get_cooked_cc_max_age();
00947   int32_t get_cooked_cc_s_maxage();
00948   int32_t get_cooked_cc_max_stale();
00949   int32_t get_cooked_cc_min_fresh();
00950   bool get_cooked_pragma_no_cache();
00951 
00952 
00953 
00954 
00955 
00956   MIMEField* get_host_port_values(
00957                             char const** host_ptr, 
00958                             int* host_len, 
00959                             char const** port_ptr, 
00960                             int* port_len 
00961                             );
00962 
00963   void set_cooked_cc_need_revalidate_once();
00964   void unset_cooked_cc_need_revalidate_once();
00965 
00966   void set_age(time_t value);
00967   void set_content_length(int64_t value);
00968   void set_date(time_t value);
00969   void set_expires(time_t value);
00970   void set_if_modified_since(time_t value);
00971   void set_if_unmodified_since(time_t value);
00972   void set_last_modified(time_t value);
00973   void set_max_forwards(int32_t value);
00974   void set_warning(int32_t value);
00975   void set_server(const char *server_id_tag, int server_id_tag_size);
00976 
00977 private:
00978 
00979   
00980     MIMEHdr(const MIMEHdr & m);
00981     MIMEHdr & operator =(const MIMEHdr & m);
00982 };
00983 
00984 
00985 
00986 
00987 inline MIMEHdr::MIMEHdr():HdrHeapSDKHandle()
00988 {
00989 }
00990 
00991 
00992 
00993 
00994 inline MIMEHdr::~MIMEHdr()
00995 {
00996 }
00997 
00998 
00999 
01000 
01001 inline int
01002 MIMEHdr::valid() const
01003 {
01004   return (m_mime && m_heap);
01005 }
01006 
01007 
01008 
01009 
01010 inline void
01011 MIMEHdr::create(HdrHeap * heap)
01012 {
01013   if (heap) {
01014     m_heap = heap;
01015   } else if (!m_heap) {
01016     m_heap = new_HdrHeap();
01017   }
01018 
01019   m_mime = mime_hdr_create(m_heap);
01020 }
01021 
01022 
01023 
01024 
01025 inline void
01026 MIMEHdr::copy(const MIMEHdr * src_hdr)
01027 {
01028   if (valid()) {
01029     mime_hdr_copy_onto(src_hdr->m_mime, src_hdr->m_heap, m_mime, m_heap, (m_heap != src_hdr->m_heap) ? true : false);
01030   } else {
01031     m_heap = new_HdrHeap();
01032     m_mime = mime_hdr_clone(src_hdr->m_mime, src_hdr->m_heap, m_heap);
01033   }
01034 }
01035 
01036 
01037 
01038 
01039 inline int
01040 MIMEHdr::length_get()
01041 {
01042   return mime_hdr_length_get(m_mime);
01043 }
01044 
01045 
01046 
01047 
01048 inline void
01049 MIMEHdr::fields_clear()
01050 {
01051   mime_hdr_fields_clear(m_heap, m_mime);
01052 }
01053 
01054 
01055 
01056 
01057 inline int
01058 MIMEHdr::fields_count()
01059 {
01060   return mime_hdr_fields_count(m_mime);
01061 }
01062 
01063 
01064 
01065 
01066 inline MIMEField *
01067 MIMEHdr::field_create(const char *name, int length)
01068 {
01069   MIMEField *field = mime_field_create(m_heap, m_mime);
01070 
01071   if (name) {
01072     int field_name_wks_idx = hdrtoken_tokenize(name, length);
01073     mime_field_name_set(m_heap, m_mime, field, field_name_wks_idx, name, length, 1);
01074   }
01075 
01076   return (field);
01077 }
01078 
01079 
01080 
01081 
01082 inline MIMEField *
01083 MIMEHdr::field_find(const char *name, int length)
01084 {
01085 
01086   return mime_hdr_field_find(m_mime, name, length);
01087 }
01088 
01089 
01090 
01091 
01092 inline void
01093 MIMEHdr::field_attach(MIMEField * field)
01094 {
01095   mime_hdr_field_attach(m_mime, field, 1, NULL);
01096 }
01097 
01098 
01099 
01100 
01101 inline void
01102 MIMEHdr::field_detach(MIMEField * field, bool detach_all_dups)
01103 {
01104   mime_hdr_field_detach(m_mime, field, detach_all_dups);
01105 }
01106 
01107 
01108 
01109 
01110 inline void
01111 MIMEHdr::field_delete(MIMEField * field, bool delete_all_dups)
01112 {
01113   mime_hdr_field_delete(m_heap, m_mime, field, delete_all_dups);
01114 }
01115 
01116 inline void
01117 MIMEHdr::field_delete(const char *name, int name_length)
01118 {
01119   MIMEField *field = field_find(name, name_length);
01120   if (field)
01121     field_delete(field);
01122 }
01123 
01124 inline MIMEField *
01125 MIMEHdr::iter_get_first(MIMEFieldIter * iter)
01126 {
01127   iter->m_block = &m_mime->m_first_fblock;
01128   iter->m_slot = (unsigned int) -1;
01129   return iter_get_next(iter);
01130 }
01131 
01132 inline MIMEField *
01133 MIMEHdr::iter_get_next(MIMEFieldIter * iter)
01134 {
01135   MIMEField *f;
01136   MIMEFieldBlockImpl *b = iter->m_block;
01137 
01138   int slot = iter->m_slot + 1;
01139 
01140   while (b) {
01141     for (; slot < (int) b->m_freetop; slot++) {
01142       f = &(b->m_field_slots[slot]);
01143       if (f->is_live()) {
01144         iter->m_slot = slot;
01145         iter->m_block = b;
01146         return f;
01147       }
01148     }
01149     b = b->m_next;
01150     slot = 0;
01151   }
01152 
01153   iter->m_block = NULL;
01154   return NULL;
01155 }
01156 
01157 
01158 
01159 
01160 inline uint64_t
01161 MIMEHdr::presence(uint64_t mask)
01162 {
01163   return (m_mime->m_presence_bits & mask);
01164 }
01165 
01166 
01167 
01168 
01169 inline int
01170 MIMEHdr::print(char *buf, int bufsize, int *bufindex, int *chars_to_skip)
01171 {
01172   return mime_hdr_print(m_heap, m_mime, buf, bufsize, bufindex, chars_to_skip);
01173 }
01174 
01175 
01176 
01177 
01178 inline int
01179 MIMEHdr::parse(MIMEParser * parser, const char **start, const char *end, bool must_copy_strs, bool eof)
01180 {
01181   if (!m_heap)
01182     m_heap = new_HdrHeap();
01183 
01184   if (!m_mime)
01185     m_mime = mime_hdr_create(m_heap);
01186 
01187   return mime_parser_parse(parser, m_heap, m_mime, start, end, must_copy_strs, eof);
01188 }
01189 
01190 
01191 
01192 
01193 inline const char *
01194 MIMEHdr::value_get(const char *name, int name_length, int *value_length_return)
01195 {
01196 
01197   MIMEField *field = field_find(name, name_length);
01198 
01199   if (field)
01200     return (mime_field_value_get(field, value_length_return));
01201   else
01202     return (NULL);
01203 }
01204 
01205 inline int32_t
01206 MIMEHdr::value_get_int(const char *name, int name_length)
01207 {
01208   MIMEField *field = field_find(name, name_length);
01209 
01210   if (field)
01211     return (mime_field_value_get_int(field));
01212   else
01213     return (0);
01214 }
01215 
01216 inline uint32_t
01217 MIMEHdr::value_get_uint(const char *name, int name_length)
01218 {
01219   MIMEField *field = field_find(name, name_length);
01220 
01221   if (field)
01222     return (mime_field_value_get_uint(field));
01223   else
01224     return (0);
01225 }
01226 
01227 inline int64_t
01228 MIMEHdr::value_get_int64(const char *name, int name_length)
01229 {
01230   MIMEField *field = field_find(name, name_length);
01231 
01232   if (field)
01233     return (mime_field_value_get_int64(field));
01234   else
01235     return (0);
01236 }
01237 
01238 inline time_t
01239 MIMEHdr::value_get_date(const char *name, int name_length)
01240 {
01241   MIMEField *field = field_find(name, name_length);
01242 
01243   if (field)
01244     return (mime_field_value_get_date(field));
01245   else
01246     return (0);
01247 }
01248 
01249 inline int
01250 MIMEHdr::value_get_comma_list(const char *name, int name_length, StrList * list)
01251 {
01252   MIMEField *field = field_find(name, name_length);
01253 
01254   if (field)
01255     return (field->value_get_comma_list(list));
01256   else
01257     return (0);
01258 }
01259 
01260 
01261 
01262 
01263 inline void
01264 MIMEHdr::field_value_set(MIMEField * field, const char *value, int value_length)
01265 {
01266   field->value_set(m_heap, m_mime, value, value_length);
01267 }
01268 
01269 inline void
01270 MIMEHdr::field_value_set_int(MIMEField * field, int32_t value)
01271 {
01272   field->value_set_int(m_heap, m_mime, value);
01273 }
01274 
01275 inline void
01276 MIMEHdr::field_value_set_uint(MIMEField * field, uint32_t value)
01277 {
01278   field->value_set_uint(m_heap, m_mime, value);
01279 }
01280 
01281 inline void
01282 MIMEHdr::field_value_set_int64(MIMEField * field, int64_t value)
01283 {
01284   field->value_set_int64(m_heap, m_mime, value);
01285 }
01286 
01287 inline void
01288 MIMEHdr::field_value_set_date(MIMEField * field, time_t value)
01289 {
01290   field->value_set_date(m_heap, m_mime, value);
01291 }
01292 
01293 
01294 
01295 
01296 inline void
01297 MIMEHdr::field_value_append(MIMEField * field,
01298                             const char *value_str, int value_len, bool prepend_comma, const char separator)
01299 {
01300   field->value_append(m_heap, m_mime, value_str, value_len, prepend_comma, separator);
01301 }
01302 
01303 
01304 
01305 
01306 inline void
01307 MIMEHdr::value_set(const char *name, int name_length, const char *value, int value_length)
01308 {
01309   MIMEField *field;
01310   field = mime_hdr_prepare_for_value_set(m_heap, m_mime, name, name_length);
01311   field->value_set(m_heap, m_mime, value, value_length);
01312 }
01313 
01314 inline void
01315 MIMEHdr::value_set_int(const char *name, int name_length, int32_t value)
01316 {
01317   MIMEField *field;
01318   field = mime_hdr_prepare_for_value_set(m_heap, m_mime, name, name_length);
01319   field->value_set_int(m_heap, m_mime, value);
01320 }
01321 
01322 inline void
01323 MIMEHdr::value_set_uint(const char *name, int name_length, uint32_t value)
01324 {
01325   MIMEField *field;
01326   field = mime_hdr_prepare_for_value_set(m_heap, m_mime, name, name_length);
01327   field->value_set_uint(m_heap, m_mime, value);
01328 }
01329 
01330 inline void
01331 MIMEHdr::value_set_int64(const char *name, int name_length, int64_t value)
01332 {
01333   MIMEField *field;
01334   field = mime_hdr_prepare_for_value_set(m_heap, m_mime, name, name_length);
01335   field->value_set_int64(m_heap, m_mime, value);
01336 }
01337 
01338 inline void
01339 MIMEHdr::value_set_date(const char *name, int name_length, time_t value)
01340 {
01341   MIMEField *field;
01342   field = mime_hdr_prepare_for_value_set(m_heap, m_mime, name, name_length);
01343   field->value_set_date(m_heap, m_mime, value);
01344 }
01345 
01346 
01347 
01348 
01349 inline void
01350 MIMEHdr::value_append(const char *name, int name_length,
01351                       const char *value, int value_length, bool prepend_comma, const char separator)
01352 {
01353   MIMEField *field;
01354 
01355   field = field_find(name, name_length);
01356   if (field) {
01357     while (field->m_next_dup)
01358       field = field->m_next_dup;
01359     field->value_append(m_heap, m_mime, value, value_length, prepend_comma, separator);
01360   } else {
01361     field = field_create(name, name_length);
01362     field_attach(field);
01363     field->value_set(m_heap, m_mime, value, value_length);
01364   }
01365 }
01366 
01367 
01368 
01369 inline time_t
01370 MIMEHdr::get_age()
01371 {
01372   int64_t age = value_get_int64(MIME_FIELD_AGE, MIME_LEN_AGE);
01373 
01374   if (age < 0) 
01375     return 0;
01376 
01377   if ((4 == sizeof(time_t)) && (age > INT_MAX)) 
01378     return -1;
01379 
01380   return age;
01381 }
01382 
01383 
01384 
01385 
01386 inline int64_t
01387 MIMEHdr::get_content_length()
01388 {
01389   return (value_get_int64(MIME_FIELD_CONTENT_LENGTH, MIME_LEN_CONTENT_LENGTH));
01390 }
01391 
01392 
01393 
01394 
01395 inline time_t
01396 MIMEHdr::get_date()
01397 {
01398   return (value_get_date(MIME_FIELD_DATE, MIME_LEN_DATE));
01399 }
01400 
01401 
01402 
01403 
01404 inline time_t
01405 MIMEHdr::get_expires()
01406 {
01407   return (value_get_date(MIME_FIELD_EXPIRES, MIME_LEN_EXPIRES));
01408 }
01409 
01410 
01411 
01412 
01413 inline time_t
01414 MIMEHdr::get_if_modified_since()
01415 {
01416   return (value_get_date(MIME_FIELD_IF_MODIFIED_SINCE, MIME_LEN_IF_MODIFIED_SINCE));
01417 }
01418 
01419 
01420 
01421 
01422 inline time_t
01423 MIMEHdr::get_if_unmodified_since()
01424 {
01425   return (value_get_date(MIME_FIELD_IF_UNMODIFIED_SINCE, MIME_LEN_IF_UNMODIFIED_SINCE));
01426 }
01427 
01428 
01429 
01430 
01431 inline time_t
01432 MIMEHdr::get_last_modified()
01433 {
01434   return (value_get_date(MIME_FIELD_LAST_MODIFIED, MIME_LEN_LAST_MODIFIED));
01435 }
01436 
01437 
01438 
01439 
01440 inline time_t
01441 MIMEHdr::get_if_range_date()
01442 {
01443   return (value_get_date(MIME_FIELD_IF_RANGE, MIME_LEN_IF_RANGE));
01444 }
01445 
01446 
01447 
01448 
01449 inline int32_t
01450 MIMEHdr::get_max_forwards()
01451 {
01452   return (value_get_int(MIME_FIELD_MAX_FORWARDS, MIME_LEN_MAX_FORWARDS));
01453 }
01454 
01455 
01456 
01457 
01458 inline int32_t
01459 MIMEHdr::get_warning(int idx)
01460 {
01461   (void) idx;
01462   
01463   ink_release_assert(!"unimplemented");
01464   return (0);
01465 }
01466 
01467 
01468 
01469 
01470 inline uint32_t
01471 MIMEHdr::get_cooked_cc_mask()
01472 {
01473   return (m_mime->m_cooked_stuff.m_cache_control.m_mask);
01474 }
01475 
01476 
01477 
01478 
01479 inline int32_t
01480 MIMEHdr::get_cooked_cc_max_age()
01481 {
01482   return (m_mime->m_cooked_stuff.m_cache_control.m_secs_max_age);
01483 }
01484 
01485 
01486 
01487 
01488 inline int32_t
01489 MIMEHdr::get_cooked_cc_s_maxage()
01490 {
01491   return (m_mime->m_cooked_stuff.m_cache_control.m_secs_s_maxage);
01492 }
01493 
01494 
01495 
01496 
01497 inline int32_t
01498 MIMEHdr::get_cooked_cc_max_stale()
01499 {
01500   return (m_mime->m_cooked_stuff.m_cache_control.m_secs_max_stale);
01501 }
01502 
01503 
01504 
01505 
01506 inline int32_t
01507 MIMEHdr::get_cooked_cc_min_fresh()
01508 {
01509   return (m_mime->m_cooked_stuff.m_cache_control.m_secs_min_fresh);
01510 }
01511 
01512 
01513 
01514 
01515 inline bool
01516 MIMEHdr::get_cooked_pragma_no_cache()
01517 {
01518   return (m_mime->m_cooked_stuff.m_pragma.m_no_cache);
01519 }
01520 
01521 
01522 
01523 
01524 inline void
01525 MIMEHdr::set_cooked_cc_need_revalidate_once()
01526 {
01527   m_mime->m_cooked_stuff.m_cache_control.m_mask |= MIME_COOKED_MASK_CC_NEED_REVALIDATE_ONCE;
01528 }
01529 
01530 
01531 
01532 
01533 inline void
01534 MIMEHdr::unset_cooked_cc_need_revalidate_once()
01535 {
01536   m_mime->m_cooked_stuff.m_cache_control.m_mask &= ~((uint32_t) MIME_COOKED_MASK_CC_NEED_REVALIDATE_ONCE);
01537 }
01538 
01539 
01540 
01541 
01542 inline void
01543 MIMEHdr::set_age(time_t value)
01544 {
01545   if (value < 0)
01546     value_set_uint(MIME_FIELD_AGE, MIME_LEN_AGE, (uint32_t)INT_MAX + 1);
01547   else {
01548     if (sizeof(time_t) > 4) {
01549       value_set_int64(MIME_FIELD_AGE, MIME_LEN_AGE, value);
01550     } else {
01551       value_set_uint(MIME_FIELD_AGE, MIME_LEN_AGE, value);
01552     }
01553   }
01554 }
01555 
01556 
01557 
01558 
01559 inline void
01560 MIMEHdr::set_content_length(int64_t value)
01561 {
01562   value_set_int64(MIME_FIELD_CONTENT_LENGTH, MIME_LEN_CONTENT_LENGTH, value);
01563 }
01564 
01565 
01566 
01567 
01568 inline void
01569 MIMEHdr::set_date(time_t value)
01570 {
01571   value_set_date(MIME_FIELD_DATE, MIME_LEN_DATE, value);
01572 }
01573 
01574 
01575 
01576 
01577 inline void
01578 MIMEHdr::set_expires(time_t value)
01579 {
01580   value_set_date(MIME_FIELD_EXPIRES, MIME_LEN_EXPIRES, value);
01581 }
01582 
01583 
01584 
01585 
01586 inline void
01587 MIMEHdr::set_if_modified_since(time_t value)
01588 {
01589   value_set_date(MIME_FIELD_IF_MODIFIED_SINCE, MIME_LEN_IF_MODIFIED_SINCE, value);
01590 }
01591 
01592 
01593 
01594 
01595 inline void
01596 MIMEHdr::set_if_unmodified_since(time_t value)
01597 {
01598   value_set_date(MIME_FIELD_IF_UNMODIFIED_SINCE, MIME_LEN_IF_UNMODIFIED_SINCE, value);
01599 }
01600 
01601 
01602 
01603 
01604 inline void
01605 MIMEHdr::set_last_modified(time_t value)
01606 {
01607   value_set_date(MIME_FIELD_LAST_MODIFIED, MIME_LEN_LAST_MODIFIED, value);
01608 }
01609 
01610 
01611 
01612 
01613 inline void
01614 MIMEHdr::set_max_forwards(int32_t value)
01615 {
01616   value_set_int(MIME_FIELD_MAX_FORWARDS, MIME_LEN_MAX_FORWARDS, value);
01617 }
01618 
01619 
01620 
01621 
01622 inline void
01623 MIMEHdr::set_warning(int32_t value)
01624 {
01625   value_set_int(MIME_FIELD_WARNING, MIME_LEN_WARNING, value);
01626 }
01627 
01628 
01629 
01630 
01631 inline void
01632 MIMEHdr::set_server(const char *server_id_tag, int server_id_tag_size)
01633 {
01634   value_set(MIME_FIELD_SERVER, MIME_LEN_SERVER, server_id_tag, server_id_tag_size);
01635 }
01636 
01637 #endif