PageRenderTime 58ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 1ms

/proxy/hdrs/HTTP.h

https://github.com/pquerna/trafficserver
C Header | 1360 lines | 968 code | 244 blank | 148 comment | 48 complexity | 0169e4cf03a65b216900f8b8ff0c5b5b MD5 | raw file
Possible License(s): Apache-2.0
  1. /** @file
  2. A brief file description
  3. @section license License
  4. Licensed to the Apache Software Foundation (ASF) under one
  5. or more contributor license agreements. See the NOTICE file
  6. distributed with this work for additional information
  7. regarding copyright ownership. The ASF licenses this file
  8. to you under the Apache License, Version 2.0 (the
  9. "License"); you may not use this file except in compliance
  10. with the License. You may obtain a copy of the License at
  11. http://www.apache.org/licenses/LICENSE-2.0
  12. Unless required by applicable law or agreed to in writing, software
  13. distributed under the License is distributed on an "AS IS" BASIS,
  14. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. See the License for the specific language governing permissions and
  16. limitations under the License.
  17. */
  18. #ifndef __HTTP_H__
  19. #define __HTTP_H__
  20. #include <assert.h>
  21. #include "Arena.h"
  22. #include "INK_MD5.h"
  23. #include "MIME.h"
  24. #include "URL.h"
  25. #include "ink_apidefs.h"
  26. #define HTTP_VERSION(a,b) ((((a) & 0xFFFF) << 16) | ((b) & 0xFFFF))
  27. #define HTTP_MINOR(v) ((v) & 0xFFFF)
  28. #define HTTP_MAJOR(v) (((v) >> 16) & 0xFFFF)
  29. enum HTTPStatus
  30. {
  31. HTTP_STATUS_NONE = 0,
  32. HTTP_STATUS_CONTINUE = 100,
  33. HTTP_STATUS_SWITCHING_PROTOCOL = 101,
  34. HTTP_STATUS_OK = 200,
  35. HTTP_STATUS_CREATED = 201,
  36. HTTP_STATUS_ACCEPTED = 202,
  37. HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION = 203,
  38. HTTP_STATUS_NO_CONTENT = 204,
  39. HTTP_STATUS_RESET_CONTENT = 205,
  40. HTTP_STATUS_PARTIAL_CONTENT = 206,
  41. HTTP_STATUS_MULTIPLE_CHOICES = 300,
  42. HTTP_STATUS_MOVED_PERMANENTLY = 301,
  43. HTTP_STATUS_MOVED_TEMPORARILY = 302,
  44. HTTP_STATUS_SEE_OTHER = 303,
  45. HTTP_STATUS_NOT_MODIFIED = 304,
  46. HTTP_STATUS_USE_PROXY = 305,
  47. HTTP_STATUS_TEMPORARY_REDIRECT = 307,
  48. HTTP_STATUS_BAD_REQUEST = 400,
  49. HTTP_STATUS_UNAUTHORIZED = 401,
  50. HTTP_STATUS_PAYMENT_REQUIRED = 402,
  51. HTTP_STATUS_FORBIDDEN = 403,
  52. HTTP_STATUS_NOT_FOUND = 404,
  53. HTTP_STATUS_METHOD_NOT_ALLOWED = 405,
  54. HTTP_STATUS_NOT_ACCEPTABLE = 406,
  55. HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED = 407,
  56. HTTP_STATUS_REQUEST_TIMEOUT = 408,
  57. HTTP_STATUS_CONFLICT = 409,
  58. HTTP_STATUS_GONE = 410,
  59. HTTP_STATUS_LENGTH_REQUIRED = 411,
  60. HTTP_STATUS_PRECONDITION_FAILED = 412,
  61. HTTP_STATUS_REQUEST_ENTITY_TOO_LARGE = 413,
  62. HTTP_STATUS_REQUEST_URI_TOO_LONG = 414,
  63. HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE = 415,
  64. HTTP_STATUS_RANGE_NOT_SATISFIABLE = 416,
  65. HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,
  66. HTTP_STATUS_NOT_IMPLEMENTED = 501,
  67. HTTP_STATUS_BAD_GATEWAY = 502,
  68. HTTP_STATUS_SERVICE_UNAVAILABLE = 503,
  69. HTTP_STATUS_GATEWAY_TIMEOUT = 504,
  70. HTTP_STATUS_HTTPVER_NOT_SUPPORTED = 505
  71. };
  72. enum HTTPKeepAlive
  73. {
  74. HTTP_KEEPALIVE_UNDEFINED = 0,
  75. HTTP_NO_KEEPALIVE,
  76. HTTP_KEEPALIVE,
  77. HTTP_PIPELINE
  78. };
  79. enum HTTPWarningCode
  80. {
  81. HTTP_WARNING_CODE_NONE = 0,
  82. HTTP_WARNING_CODE_RESPONSE_STALE = 110,
  83. HTTP_WARNING_CODE_REVALIDATION_FAILED = 111,
  84. HTTP_WARNING_CODE_DISCONNECTED_OPERATION = 112,
  85. HTTP_WARNING_CODE_HERUISTIC_EXPIRATION = 113,
  86. HTTP_WARNING_CODE_TRANSFORMATION_APPLIED = 114,
  87. HTTP_WARNING_CODE_MISC_WARNING = 199
  88. };
  89. /* squild log codes */
  90. enum SquidLogCode
  91. {
  92. SQUID_LOG_EMPTY = '0',
  93. SQUID_LOG_TCP_HIT = '1',
  94. SQUID_LOG_TCP_DISK_HIT = '2',
  95. SQUID_LOG_TCP_MEM_HIT = '.', // Don't want to change others codes
  96. SQUID_LOG_TCP_MISS = '3',
  97. SQUID_LOG_TCP_EXPIRED_MISS = '4',
  98. SQUID_LOG_TCP_REFRESH_HIT = '5',
  99. SQUID_LOG_TCP_REF_FAIL_HIT = '6',
  100. SQUID_LOG_TCP_REFRESH_MISS = '7',
  101. SQUID_LOG_TCP_CLIENT_REFRESH = '8',
  102. SQUID_LOG_TCP_IMS_HIT = '9',
  103. SQUID_LOG_TCP_IMS_MISS = 'a',
  104. SQUID_LOG_TCP_SWAPFAIL = 'b',
  105. SQUID_LOG_TCP_DENIED = 'c',
  106. SQUID_LOG_TCP_WEBFETCH_MISS = 'd',
  107. SQUID_LOG_TCP_SPIDER_BYPASS = 'e',
  108. SQUID_LOG_TCP_FUTURE_2 = 'f',
  109. SQUID_LOG_UDP_HIT = 'g',
  110. SQUID_LOG_UDP_WEAK_HIT = 'h',
  111. SQUID_LOG_UDP_HIT_OBJ = 'i',
  112. SQUID_LOG_UDP_MISS = 'j',
  113. SQUID_LOG_UDP_DENIED = 'k',
  114. SQUID_LOG_UDP_INVALID = 'l',
  115. SQUID_LOG_UDP_RELOADING = 'm',
  116. SQUID_LOG_UDP_FUTURE_1 = 'n',
  117. SQUID_LOG_UDP_FUTURE_2 = 'o',
  118. SQUID_LOG_ERR_READ_TIMEOUT = 'p',
  119. SQUID_LOG_ERR_LIFETIME_EXP = 'q',
  120. SQUID_LOG_ERR_NO_CLIENTS_BIG_OBJ = 'r',
  121. SQUID_LOG_ERR_READ_ERROR = 's',
  122. SQUID_LOG_ERR_CLIENT_ABORT = 't',
  123. SQUID_LOG_ERR_CONNECT_FAIL = 'u',
  124. SQUID_LOG_ERR_INVALID_REQ = 'v',
  125. SQUID_LOG_ERR_UNSUP_REQ = 'w',
  126. SQUID_LOG_ERR_INVALID_URL = 'x',
  127. SQUID_LOG_ERR_NO_FDS = 'y',
  128. SQUID_LOG_ERR_DNS_FAIL = 'z',
  129. SQUID_LOG_ERR_NOT_IMPLEMENTED = 'A',
  130. SQUID_LOG_ERR_CANNOT_FETCH = 'B',
  131. SQUID_LOG_ERR_NO_RELAY = 'C',
  132. SQUID_LOG_ERR_DISK_IO = 'D',
  133. SQUID_LOG_ERR_ZERO_SIZE_OBJECT = 'E',
  134. SQUID_LOG_ERR_FTP_DISABLED = 'F',
  135. SQUID_LOG_ERR_PROXY_DENIED = 'G',
  136. SQUID_LOG_ERR_WEBFETCH_DETECTED = 'H',
  137. SQUID_LOG_ERR_FUTURE_1 = 'I',
  138. SQUID_LOG_ERR_SPIDER_MEMBER_ABORTED = 'J',
  139. SQUID_LOG_ERR_SPIDER_PARENTAL_CONTROL_RESTRICTION = 'K',
  140. SQUID_LOG_ERR_SPIDER_UNSUPPORTED_HTTP_VERSION = 'L',
  141. SQUID_LOG_ERR_SPIDER_UIF = 'M',
  142. SQUID_LOG_ERR_SPIDER_FUTURE_USE_1 = 'N',
  143. SQUID_LOG_ERR_SPIDER_TIMEOUT_WHILE_PASSING = 'O',
  144. SQUID_LOG_ERR_SPIDER_TIMEOUT_WHILE_DRAINING = 'P',
  145. SQUID_LOG_ERR_SPIDER_GENERAL_TIMEOUT = 'Q',
  146. SQUID_LOG_ERR_SPIDER_CONNECT_FAILED = 'R',
  147. SQUID_LOG_ERR_SPIDER_FUTURE_USE_2 = 'S',
  148. SQUID_LOG_ERR_SPIDER_NO_RESOURCES = 'T',
  149. SQUID_LOG_ERR_SPIDER_INTERNAL_ERROR = 'U',
  150. SQUID_LOG_ERR_SPIDER_INTERNAL_IO_ERROR = 'V',
  151. SQUID_LOG_ERR_SPIDER_DNS_TEMP_ERROR = 'W',
  152. SQUID_LOG_ERR_SPIDER_DNS_HOST_NOT_FOUND = 'X',
  153. SQUID_LOG_ERR_SPIDER_DNS_NO_ADDRESS = 'Y',
  154. SQUID_LOG_ERR_UNKNOWN = 'Z'
  155. };
  156. /* squid hieratchy codes */
  157. enum SquidHierarchyCode
  158. {
  159. SQUID_HIER_EMPTY = '0',
  160. SQUID_HIER_NONE = '1',
  161. SQUID_HIER_DIRECT = '2',
  162. SQUID_HIER_SIBLING_HIT = '3',
  163. SQUID_HIER_PARENT_HIT = '4',
  164. SQUID_HIER_DEFAULT_PARENT = '5',
  165. SQUID_HIER_SINGLE_PARENT = '6',
  166. SQUID_HIER_FIRST_UP_PARENT = '7',
  167. SQUID_HIER_NO_PARENT_DIRECT = '8',
  168. SQUID_HIER_FIRST_PARENT_MISS = '9',
  169. SQUID_HIER_LOCAL_IP_DIRECT = 'a',
  170. SQUID_HIER_FIREWALL_IP_DIRECT = 'b',
  171. SQUID_HIER_NO_DIRECT_FAIL = 'c',
  172. SQUID_HIER_SOURCE_FASTEST = 'd',
  173. SQUID_HIER_SIBLING_UDP_HIT_OBJ = 'e',
  174. SQUID_HIER_PARENT_UDP_HIT_OBJ = 'f',
  175. SQUID_HIER_PASSTHROUGH_PARENT = 'g',
  176. SQUID_HIER_SSL_PARENT_MISS = 'h',
  177. SQUID_HIER_INVALID_CODE = 'i',
  178. SQUID_HIER_TIMEOUT_DIRECT = 'j',
  179. SQUID_HIER_TIMEOUT_SIBLING_HIT = 'k',
  180. SQUID_HIER_TIMEOUT_PARENT_HIT = 'l',
  181. SQUID_HIER_TIMEOUT_DEFAULT_PARENT = 'm',
  182. SQUID_HIER_TIMEOUT_SINGLE_PARENT = 'n',
  183. SQUID_HIER_TIMEOUT_FIRST_UP_PARENT = 'o',
  184. SQUID_HIER_TIMEOUT_NO_PARENT_DIRECT = 'p',
  185. SQUID_HIER_TIMEOUT_FIRST_PARENT_MISS = 'q',
  186. SQUID_HIER_TIMEOUT_LOCAL_IP_DIRECT = 'r',
  187. SQUID_HIER_TIMEOUT_FIREWALL_IP_DIRECT = 's',
  188. SQUID_HIER_TIMEOUT_NO_DIRECT_FAIL = 't',
  189. SQUID_HIER_TIMEOUT_SOURCE_FASTEST = 'u',
  190. SQUID_HIER_TIMEOUT_SIBLING_UDP_HIT_OBJ = 'v',
  191. SQUID_HIER_TIMEOUT_PARENT_UDP_HIT_OBJ = 'w',
  192. SQUID_HIER_TIMEOUT_PASSTHROUGH_PARENT = 'x',
  193. SQUID_HIER_TIMEOUT_TIMEOUT_SSL_PARENT_MISS = 'y',
  194. SQUID_HIER_INVALID_ASSIGNED_CODE = 'z'
  195. };
  196. /* squid hit/miss codes */
  197. enum SquidHitMissCode
  198. {
  199. SQUID_HIT_RESERVED = '0',
  200. SQUID_HIT_LEVEL_1 = '1',
  201. SQUID_HIT_LEVEL_2 = '2',
  202. SQUID_HIT_LEVEL_3 = '3',
  203. SQUID_HIT_LEVEL_4 = '4',
  204. SQUID_HIT_LEVEL_5 = '5',
  205. SQUID_HIT_LEVEL_6 = '6',
  206. SQUID_HIT_LEVEL_7 = '7',
  207. SQUID_HIT_LEVEL_8 = '8',
  208. SQUID_HIT_LEVEl_9 = '9',
  209. SQUID_MISS_NONE = '1',
  210. SQUID_MISS_ICP_AUTH = '2',
  211. SQUID_MISS_HTTP_NON_CACHE = '3',
  212. SQUID_MISS_ICP_STOPLIST = '4',
  213. SQUID_MISS_HTTP_NO_DLE = '5',
  214. SQUID_MISS_HTTP_NO_LE = '6',
  215. SQUID_MISS_HTTP_CONTENT = '7',
  216. SQUID_MISS_PRAGMA_NOCACHE = '8',
  217. SQUID_MISS_PASS = '9',
  218. SQUID_MISS_PRE_EXPIRED = 'a',
  219. SQUID_MISS_ERROR = 'b',
  220. SQUID_MISS_CACHE_BYPASS = 'c',
  221. SQUID_HIT_MISS_INVALID_ASSIGNED_CODE = 'z'
  222. };
  223. enum HTTPType
  224. {
  225. HTTP_TYPE_UNKNOWN,
  226. HTTP_TYPE_REQUEST,
  227. HTTP_TYPE_RESPONSE
  228. };
  229. struct HTTPHdrImpl:public HdrHeapObjImpl
  230. {
  231. HTTPType m_polarity; // request or response or unknown
  232. ink32 m_version; // cooked version number
  233. union
  234. {
  235. struct
  236. {
  237. URLImpl *m_url_impl;
  238. const char *m_ptr_method;
  239. inku16 m_len_method;
  240. ink16 m_method_wks_idx;
  241. } req;
  242. struct
  243. {
  244. const char *m_ptr_reason;
  245. inku16 m_len_reason;
  246. ink16 m_status;
  247. } resp;
  248. } u;
  249. MIMEHdrImpl *m_fields_impl;
  250. // Marshaling Functions
  251. int marshal(MarshalXlate * ptr_xlate, int num_ptr, MarshalXlate * str_xlate, int num_str);
  252. void unmarshal(long offset);
  253. void move_strings(HdrStrHeap * new_heap);
  254. // Sanity Check Functions
  255. void check_strings(HeapCheck * heaps, int num_heaps);
  256. };
  257. struct HTTPValAccept
  258. {
  259. char *type;
  260. char *subtype;
  261. double qvalue;
  262. };
  263. struct HTTPValAcceptCharset
  264. {
  265. char *charset;
  266. double qvalue;
  267. };
  268. struct HTTPValAcceptEncoding
  269. {
  270. char *encoding;
  271. double qvalue;
  272. };
  273. struct HTTPValAcceptLanguage
  274. {
  275. char *language;
  276. double qvalue;
  277. };
  278. struct HTTPValFieldList
  279. {
  280. char *name;
  281. HTTPValFieldList *next;
  282. };
  283. struct HTTPValCacheControl
  284. {
  285. const char *directive;
  286. union
  287. {
  288. int delta_seconds;
  289. HTTPValFieldList *field_names;
  290. } u;
  291. };
  292. struct HTTPValRange
  293. {
  294. int start;
  295. int end;
  296. HTTPValRange *next;
  297. };
  298. struct HTTPValTE
  299. {
  300. char *encoding;
  301. double qvalue;
  302. };
  303. struct HTTPParser
  304. {
  305. bool m_parsing_http;
  306. MIMEParser m_mime_parser;
  307. };
  308. extern const char *HTTP_METHOD_CONNECT;
  309. extern const char *HTTP_METHOD_DELETE;
  310. extern const char *HTTP_METHOD_GET;
  311. extern const char *HTTP_METHOD_HEAD;
  312. extern const char *HTTP_METHOD_ICP_QUERY;
  313. extern const char *HTTP_METHOD_OPTIONS;
  314. extern const char *HTTP_METHOD_POST;
  315. extern const char *HTTP_METHOD_PURGE;
  316. extern const char *HTTP_METHOD_PUT;
  317. extern const char *HTTP_METHOD_TRACE;
  318. extern const char *HTTP_METHOD_PUSH;
  319. extern int HTTP_WKSIDX_CONNECT;
  320. extern int HTTP_WKSIDX_DELETE;
  321. extern int HTTP_WKSIDX_GET;
  322. extern int HTTP_WKSIDX_HEAD;
  323. extern int HTTP_WKSIDX_ICP_QUERY;
  324. extern int HTTP_WKSIDX_OPTIONS;
  325. extern int HTTP_WKSIDX_POST;
  326. extern int HTTP_WKSIDX_PURGE;
  327. extern int HTTP_WKSIDX_PUT;
  328. extern int HTTP_WKSIDX_TRACE;
  329. extern int HTTP_WKSIDX_PUSH;
  330. extern int HTTP_WKSIDX_METHODS_CNT;
  331. extern int HTTP_LEN_CONNECT;
  332. extern int HTTP_LEN_DELETE;
  333. extern int HTTP_LEN_GET;
  334. extern int HTTP_LEN_HEAD;
  335. extern int HTTP_LEN_ICP_QUERY;
  336. extern int HTTP_LEN_OPTIONS;
  337. extern int HTTP_LEN_POST;
  338. extern int HTTP_LEN_PURGE;
  339. extern int HTTP_LEN_PUT;
  340. extern int HTTP_LEN_TRACE;
  341. extern int HTTP_LEN_PUSH;
  342. extern const char *HTTP_VALUE_BYTES;
  343. extern const char *HTTP_VALUE_CHUNKED;
  344. extern const char *HTTP_VALUE_CLOSE;
  345. extern const char *HTTP_VALUE_COMPRESS;
  346. extern const char *HTTP_VALUE_DEFLATE;
  347. extern const char *HTTP_VALUE_GZIP;
  348. extern const char *HTTP_VALUE_IDENTITY;
  349. extern const char *HTTP_VALUE_KEEP_ALIVE;
  350. extern const char *HTTP_VALUE_MAX_AGE;
  351. extern const char *HTTP_VALUE_MAX_STALE;
  352. extern const char *HTTP_VALUE_MIN_FRESH;
  353. extern const char *HTTP_VALUE_MUST_REVALIDATE;
  354. extern const char *HTTP_VALUE_NONE;
  355. extern const char *HTTP_VALUE_NO_CACHE;
  356. extern const char *HTTP_VALUE_NO_STORE;
  357. extern const char *HTTP_VALUE_NO_TRANSFORM;
  358. extern const char *HTTP_VALUE_ONLY_IF_CACHED;
  359. extern const char *HTTP_VALUE_PRIVATE;
  360. extern const char *HTTP_VALUE_PROXY_REVALIDATE;
  361. extern const char *HTTP_VALUE_PUBLIC;
  362. extern const char *HTTP_VALUE_S_MAXAGE;
  363. extern const char *HTTP_VALUE_NEED_REVALIDATE_ONCE;
  364. extern int HTTP_LEN_BYTES;
  365. extern int HTTP_LEN_CHUNKED;
  366. extern int HTTP_LEN_CLOSE;
  367. extern int HTTP_LEN_COMPRESS;
  368. extern int HTTP_LEN_DEFLATE;
  369. extern int HTTP_LEN_GZIP;
  370. extern int HTTP_LEN_IDENTITY;
  371. extern int HTTP_LEN_KEEP_ALIVE;
  372. extern int HTTP_LEN_MAX_AGE;
  373. extern int HTTP_LEN_MAX_STALE;
  374. extern int HTTP_LEN_MIN_FRESH;
  375. extern int HTTP_LEN_MUST_REVALIDATE;
  376. extern int HTTP_LEN_NONE;
  377. extern int HTTP_LEN_NO_CACHE;
  378. extern int HTTP_LEN_NO_STORE;
  379. extern int HTTP_LEN_NO_TRANSFORM;
  380. extern int HTTP_LEN_ONLY_IF_CACHED;
  381. extern int HTTP_LEN_PRIVATE;
  382. extern int HTTP_LEN_PROXY_REVALIDATE;
  383. extern int HTTP_LEN_PUBLIC;
  384. extern int HTTP_LEN_S_MAXAGE;
  385. extern int HTTP_LEN_NEED_REVALIDATE_ONCE;
  386. /* Private */
  387. void http_hdr_adjust(HTTPHdrImpl * hdrp, ink32 offset, ink32 length, ink32 delta);
  388. /* Public */
  389. void http_init(const char *path);
  390. inkcoreapi HTTPHdrImpl *http_hdr_create(HdrHeap * heap, HTTPType polarity);
  391. void http_hdr_init(HdrHeap * heap, HTTPHdrImpl * hh, HTTPType polarity);
  392. HTTPHdrImpl *http_hdr_clone(HTTPHdrImpl * s_hh, HdrHeap * s_heap, HdrHeap * d_heap);
  393. void http_hdr_copy_onto(HTTPHdrImpl * s_hh, HdrHeap * s_heap, HTTPHdrImpl * d_hh, HdrHeap * d_heap, bool inherit_strs);
  394. inkcoreapi int http_hdr_print(HdrHeap * heap, HTTPHdrImpl * hh, char *buf, int bufsize, int *bufindex, int *dumpoffset);
  395. void http_hdr_describe(HdrHeapObjImpl * obj, bool recurse = true);
  396. int http_hdr_length_get(HTTPHdrImpl * hh);
  397. // HTTPType http_hdr_type_get (HTTPHdrImpl *hh);
  398. // ink32 http_hdr_version_get (HTTPHdrImpl *hh);
  399. inkcoreapi void http_hdr_version_set(HTTPHdrImpl * hh, ink32 ver);
  400. const char *http_hdr_method_get(HTTPHdrImpl * hh, int *length);
  401. inkcoreapi void http_hdr_method_set(HdrHeap * heap, HTTPHdrImpl * hh,
  402. const char *method, ink16 method_wks_idx, int method_length, bool must_copy);
  403. void http_hdr_url_set(HdrHeap * heap, HTTPHdrImpl * hh, URLImpl * url);
  404. // HTTPStatus http_hdr_status_get (HTTPHdrImpl *hh);
  405. void http_hdr_status_set(HTTPHdrImpl * hh, HTTPStatus status);
  406. const char *http_hdr_reason_get(HTTPHdrImpl * hh, int *length);
  407. void http_hdr_reason_set(HdrHeap * heap, HTTPHdrImpl * hh, const char *value, int length, bool must_copy);
  408. const char *http_hdr_reason_lookup(HTTPStatus status);
  409. void http_parser_init(HTTPParser * parser);
  410. void http_parser_clear(HTTPParser * parser);
  411. MIMEParseResult http_parser_parse_req(HTTPParser * parser, HdrHeap * heap,
  412. HTTPHdrImpl * hh, const char **start,
  413. const char *end, bool must_copy_strings, bool eof);
  414. MIMEParseResult http_parser_parse_resp(HTTPParser * parser, HdrHeap * heap,
  415. HTTPHdrImpl * hh, const char **start,
  416. const char *end, bool must_copy_strings, bool eof);
  417. HTTPStatus http_parse_status(const char *start, const char *end);
  418. ink32 http_parse_version(const char *start, const char *end);
  419. /*
  420. HTTPValAccept* http_parse_accept (const char *buf, Arena *arena);
  421. HTTPValAcceptCharset* http_parse_accept_charset (const char *buf, Arena *arena);
  422. HTTPValAcceptEncoding* http_parse_accept_encoding (const char *buf, Arena *arena);
  423. HTTPValAcceptLanguage* http_parse_accept_language (const char *buf, Arena *arena);
  424. HTTPValCacheControl* http_parse_cache_control (const char *buf, Arena *arena);
  425. const char* http_parse_cache_directive (const char **buf);
  426. HTTPValRange* http_parse_range (const char *buf, Arena *arena);
  427. */
  428. HTTPValTE *http_parse_te(const char *buf, int len, Arena * arena);
  429. class HTTPVersion
  430. {
  431. public:
  432. HTTPVersion();
  433. HTTPVersion(ink32 version);
  434. HTTPVersion(int ver_major, int ver_minor);
  435. void set(HTTPVersion ver);
  436. void set(int ver_major, int ver_minor);
  437. HTTPVersion & operator =(const HTTPVersion & hv);
  438. int operator ==(const HTTPVersion & hv);
  439. int operator !=(const HTTPVersion & hv);
  440. int operator >(const HTTPVersion & hv);
  441. int operator <(const HTTPVersion & hv);
  442. int operator >=(const HTTPVersion & hv);
  443. int operator <=(const HTTPVersion & hv);
  444. public:
  445. ink32 m_version;
  446. };
  447. class IOBufferReader;
  448. class HTTPHdr:public MIMEHdr
  449. {
  450. public:
  451. HTTPHdrImpl * m_http;
  452. URL m_url_cached;
  453. HTTPHdr();
  454. ~HTTPHdr();
  455. int valid() const;
  456. void create(HTTPType polarity, HdrHeap * heap = NULL);
  457. void clear();
  458. void reset();
  459. void copy(const HTTPHdr * hdr);
  460. void copy_shallow(const HTTPHdr * hdr);
  461. int unmarshal(char *buf, int len, RefCountObj * block_ref);
  462. int print(char *buf, int bufsize, int *bufindex, int *dumpoffset);
  463. int length_get();
  464. HTTPType type_get() const;
  465. HTTPVersion version_get();
  466. void version_set(HTTPVersion version);
  467. const char *method_get(int *length);
  468. int method_get_wksidx();
  469. void method_set(const char *value, int length);
  470. URL *url_create(URL * url);
  471. URL *url_get();
  472. URL *url_get(URL * url);
  473. void url_set(URL * url);
  474. void url_set_as_server_url(URL * url);
  475. void url_set(const char *str, int length);
  476. HTTPStatus status_get();
  477. void status_set(HTTPStatus status);
  478. const char *reason_get(int *length);
  479. void reason_set(const char *value, int length);
  480. int parse_req(HTTPParser * parser, const char **start, const char *end, bool eof);
  481. int parse_resp(HTTPParser * parser, const char **start, const char *end, bool eof);
  482. int parse_req(HTTPParser * parser, IOBufferReader * r, int *bytes_used, bool eof);
  483. int parse_resp(HTTPParser * parser, IOBufferReader * r, int *bytes_used, bool eof);
  484. public:
  485. // Utility routines
  486. bool is_cache_control_set(const char *cc_directive_wks);
  487. bool is_pragma_no_cache_set();
  488. private:
  489. // No gratuitous copies!
  490. HTTPHdr(const HTTPHdr & m);
  491. HTTPHdr & operator =(const HTTPHdr & m);
  492. };
  493. /*-------------------------------------------------------------------------
  494. -------------------------------------------------------------------------*/
  495. inline HTTPVersion::HTTPVersion()
  496. :m_version(HTTP_VERSION(0, 9))
  497. {
  498. }
  499. /*-------------------------------------------------------------------------
  500. -------------------------------------------------------------------------*/
  501. inline HTTPVersion::HTTPVersion(ink32 version)
  502. :m_version(version)
  503. {
  504. }
  505. /*-------------------------------------------------------------------------
  506. -------------------------------------------------------------------------*/
  507. inline HTTPVersion::HTTPVersion(int ver_major, int ver_minor)
  508. :
  509. m_version(HTTP_VERSION(ver_major, ver_minor))
  510. {
  511. }
  512. /*-------------------------------------------------------------------------
  513. -------------------------------------------------------------------------*/
  514. inline void
  515. HTTPVersion::set(HTTPVersion ver)
  516. {
  517. m_version = ver.m_version;
  518. }
  519. /*-------------------------------------------------------------------------
  520. -------------------------------------------------------------------------*/
  521. inline void
  522. HTTPVersion::set(int ver_major, int ver_minor)
  523. {
  524. m_version = HTTP_VERSION(ver_major, ver_minor);
  525. }
  526. /*-------------------------------------------------------------------------
  527. -------------------------------------------------------------------------*/
  528. inline HTTPVersion &
  529. HTTPVersion::operator =(const HTTPVersion & hv)
  530. {
  531. m_version = hv.m_version;
  532. return *this;
  533. }
  534. /*-------------------------------------------------------------------------
  535. -------------------------------------------------------------------------*/
  536. inline int
  537. HTTPVersion::operator ==(const HTTPVersion & hv)
  538. {
  539. return (m_version == hv.m_version);
  540. }
  541. /*-------------------------------------------------------------------------
  542. -------------------------------------------------------------------------*/
  543. inline int
  544. HTTPVersion::operator !=(const HTTPVersion & hv)
  545. {
  546. return (m_version != hv.m_version);
  547. }
  548. /*-------------------------------------------------------------------------
  549. -------------------------------------------------------------------------*/
  550. inline int
  551. HTTPVersion::operator >(const HTTPVersion & hv)
  552. {
  553. return (m_version > hv.m_version);
  554. }
  555. /*-------------------------------------------------------------------------
  556. -------------------------------------------------------------------------*/
  557. inline int
  558. HTTPVersion::operator <(const HTTPVersion & hv)
  559. {
  560. return (m_version < hv.m_version);
  561. }
  562. /*-------------------------------------------------------------------------
  563. -------------------------------------------------------------------------*/
  564. inline int
  565. HTTPVersion::operator >=(const HTTPVersion & hv)
  566. {
  567. return (m_version >= hv.m_version);
  568. }
  569. /*-------------------------------------------------------------------------
  570. -------------------------------------------------------------------------*/
  571. inline int
  572. HTTPVersion::operator <=(const HTTPVersion & hv)
  573. {
  574. return (m_version <= hv.m_version);
  575. }
  576. /*-------------------------------------------------------------------------
  577. -------------------------------------------------------------------------*/
  578. inline HTTPHdr::HTTPHdr()
  579. :MIMEHdr(), m_http(NULL), m_url_cached()
  580. {
  581. }
  582. /*-------------------------------------------------------------------------
  583. -------------------------------------------------------------------------*/
  584. /*-------------------------------------------------------------------------
  585. -------------------------------------------------------------------------*/
  586. inline
  587. HTTPHdr::~
  588. HTTPHdr()
  589. { /* nop */
  590. }
  591. /*-------------------------------------------------------------------------
  592. -------------------------------------------------------------------------*/
  593. inline int
  594. HTTPHdr::valid() const
  595. {
  596. return (m_http && m_mime && m_heap);
  597. }
  598. /*-------------------------------------------------------------------------
  599. -------------------------------------------------------------------------*/
  600. inline void
  601. HTTPHdr::create(HTTPType polarity, HdrHeap * heap)
  602. {
  603. if (heap) {
  604. m_heap = heap;
  605. } else if (!m_heap) {
  606. m_heap = new_HdrHeap();
  607. }
  608. m_http = http_hdr_create(m_heap, polarity);
  609. m_mime = m_http->m_fields_impl;
  610. }
  611. inline void
  612. HTTPHdr::clear()
  613. {
  614. if (m_http && m_http->m_polarity == HTTP_TYPE_REQUEST) {
  615. m_url_cached.clear();
  616. }
  617. this->HdrHeapSDKHandle::clear();
  618. m_http = NULL;
  619. m_mime = NULL;
  620. }
  621. inline void
  622. HTTPHdr::reset()
  623. {
  624. m_heap = NULL;
  625. m_http = NULL;
  626. m_mime = NULL;
  627. m_url_cached.reset();
  628. }
  629. /*-------------------------------------------------------------------------
  630. -------------------------------------------------------------------------*/
  631. inline void
  632. HTTPHdr::copy(const HTTPHdr * hdr)
  633. {
  634. ink_debug_assert(hdr->valid());
  635. if (valid()) {
  636. http_hdr_copy_onto(hdr->m_http, hdr->m_heap, m_http, m_heap, (m_heap != hdr->m_heap) ? true : false);
  637. } else {
  638. m_heap = new_HdrHeap();
  639. m_http = http_hdr_clone(hdr->m_http, hdr->m_heap, m_heap);
  640. m_mime = m_http->m_fields_impl;
  641. }
  642. }
  643. /*-------------------------------------------------------------------------
  644. -------------------------------------------------------------------------*/
  645. inline void
  646. HTTPHdr::copy_shallow(const HTTPHdr * hdr)
  647. {
  648. ink_debug_assert(hdr->valid());
  649. m_heap = hdr->m_heap;
  650. m_http = hdr->m_http;
  651. m_mime = hdr->m_mime;
  652. if (hdr->type_get() == HTTP_TYPE_REQUEST && m_url_cached.valid())
  653. m_url_cached.copy_shallow(&hdr->m_url_cached);
  654. }
  655. /*-------------------------------------------------------------------------
  656. -------------------------------------------------------------------------*/
  657. inline int
  658. HTTPHdr::print(char *buf, int bufsize, int *bufindex, int *dumpoffset)
  659. {
  660. ink_debug_assert(valid());
  661. return http_hdr_print(m_heap, m_http, buf, bufsize, bufindex, dumpoffset);
  662. }
  663. /*-------------------------------------------------------------------------
  664. -------------------------------------------------------------------------*/
  665. inline int
  666. HTTPHdr::length_get()
  667. {
  668. ink_debug_assert(valid());
  669. return http_hdr_length_get(m_http);
  670. }
  671. /*-------------------------------------------------------------------------
  672. -------------------------------------------------------------------------*/
  673. inline HTTPType
  674. http_hdr_type_get(HTTPHdrImpl * hh)
  675. {
  676. return (hh->m_polarity);
  677. }
  678. /*-------------------------------------------------------------------------
  679. -------------------------------------------------------------------------*/
  680. inline HTTPType
  681. HTTPHdr::type_get() const
  682. {
  683. ink_debug_assert(valid());
  684. return http_hdr_type_get(m_http);
  685. }
  686. /*-------------------------------------------------------------------------
  687. -------------------------------------------------------------------------*/
  688. inline ink32
  689. http_hdr_version_get(HTTPHdrImpl * hh)
  690. {
  691. return (hh->m_version);
  692. }
  693. /*-------------------------------------------------------------------------
  694. -------------------------------------------------------------------------*/
  695. inline HTTPVersion
  696. HTTPHdr::version_get()
  697. {
  698. ink_debug_assert(valid());
  699. return HTTPVersion(http_hdr_version_get(m_http));
  700. }
  701. /*-------------------------------------------------------------------------
  702. -------------------------------------------------------------------------*/
  703. inline void
  704. HTTPHdr::version_set(HTTPVersion version)
  705. {
  706. ink_debug_assert(valid());
  707. http_hdr_version_set(m_http, version.m_version);
  708. }
  709. /*-------------------------------------------------------------------------
  710. -------------------------------------------------------------------------*/
  711. inline const char *
  712. HTTPHdr::method_get(int *length)
  713. {
  714. ink_debug_assert(valid());
  715. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
  716. return http_hdr_method_get(m_http, length);
  717. }
  718. inline int
  719. HTTPHdr::method_get_wksidx()
  720. {
  721. ink_debug_assert(valid());
  722. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
  723. return (m_http->u.req.m_method_wks_idx);
  724. }
  725. /*-------------------------------------------------------------------------
  726. -------------------------------------------------------------------------*/
  727. inline void
  728. HTTPHdr::method_set(const char *value, int length)
  729. {
  730. ink_debug_assert(valid());
  731. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
  732. int method_wks_idx = hdrtoken_tokenize(value, length);
  733. http_hdr_method_set(m_heap, m_http, value, method_wks_idx, length, true);
  734. }
  735. /*-------------------------------------------------------------------------
  736. -------------------------------------------------------------------------*/
  737. inline URL *
  738. HTTPHdr::url_create(URL * u)
  739. {
  740. ink_debug_assert(valid());
  741. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
  742. u->set(this);
  743. u->create(m_heap);
  744. return (u);
  745. }
  746. /*-------------------------------------------------------------------------
  747. -------------------------------------------------------------------------*/
  748. inline URL *
  749. HTTPHdr::url_get()
  750. {
  751. ink_debug_assert(valid());
  752. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
  753. // It's entirely possible that someone changed URL in our impl
  754. // without updating the cached copy in the C++ layer. Check
  755. // to see if this happened before handing back the url
  756. URLImpl *real_impl = m_http->u.req.m_url_impl;
  757. if (m_url_cached.m_url_impl != real_impl) {
  758. m_url_cached.set(this);
  759. m_url_cached.m_url_impl = real_impl;
  760. }
  761. return (&m_url_cached);
  762. }
  763. /*-------------------------------------------------------------------------
  764. -------------------------------------------------------------------------*/
  765. inline URL *
  766. HTTPHdr::url_get(URL * url)
  767. {
  768. ink_debug_assert(valid());
  769. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
  770. url->set(this); // attach refcount
  771. url->m_url_impl = m_http->u.req.m_url_impl;
  772. return (url);
  773. }
  774. /*-------------------------------------------------------------------------
  775. -------------------------------------------------------------------------*/
  776. inline void
  777. HTTPHdr::url_set(URL * url)
  778. {
  779. ink_debug_assert(valid());
  780. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
  781. URLImpl *url_impl = m_http->u.req.m_url_impl;
  782. ::url_copy_onto(url->m_url_impl, url->m_heap, url_impl, m_heap, true);
  783. }
  784. /*-------------------------------------------------------------------------
  785. -------------------------------------------------------------------------*/
  786. inline void
  787. HTTPHdr::url_set_as_server_url(URL * url)
  788. {
  789. ink_debug_assert(valid());
  790. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
  791. URLImpl *url_impl = m_http->u.req.m_url_impl;
  792. ::url_copy_onto_as_server_url(url->m_url_impl, url->m_heap, url_impl, m_heap, true);
  793. }
  794. /*-------------------------------------------------------------------------
  795. -------------------------------------------------------------------------*/
  796. inline void
  797. HTTPHdr::url_set(const char *str, int length)
  798. {
  799. URLImpl *url_impl;
  800. ink_debug_assert(valid());
  801. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
  802. url_impl = m_http->u.req.m_url_impl;
  803. ::url_clear(url_impl);
  804. ::url_parse(m_heap, url_impl, &str, str + length, true);
  805. }
  806. /*-------------------------------------------------------------------------
  807. -------------------------------------------------------------------------*/
  808. inline HTTPStatus
  809. http_hdr_status_get(HTTPHdrImpl * hh)
  810. {
  811. ink_debug_assert(hh->m_polarity == HTTP_TYPE_RESPONSE);
  812. return (HTTPStatus) hh->u.resp.m_status;
  813. }
  814. /*-------------------------------------------------------------------------
  815. -------------------------------------------------------------------------*/
  816. inline HTTPStatus
  817. HTTPHdr::status_get()
  818. {
  819. ink_debug_assert(valid());
  820. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_RESPONSE);
  821. return http_hdr_status_get(m_http);
  822. }
  823. /*-------------------------------------------------------------------------
  824. -------------------------------------------------------------------------*/
  825. inline void
  826. HTTPHdr::status_set(HTTPStatus status)
  827. {
  828. ink_debug_assert(valid());
  829. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_RESPONSE);
  830. http_hdr_status_set(m_http, status);
  831. }
  832. /*-------------------------------------------------------------------------
  833. -------------------------------------------------------------------------*/
  834. inline const char *
  835. HTTPHdr::reason_get(int *length)
  836. {
  837. ink_debug_assert(valid());
  838. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_RESPONSE);
  839. return http_hdr_reason_get(m_http, length);
  840. }
  841. /*-------------------------------------------------------------------------
  842. -------------------------------------------------------------------------*/
  843. inline void
  844. HTTPHdr::reason_set(const char *value, int length)
  845. {
  846. ink_debug_assert(valid());
  847. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_RESPONSE);
  848. http_hdr_reason_set(m_heap, m_http, value, length, true);
  849. }
  850. /*-------------------------------------------------------------------------
  851. -------------------------------------------------------------------------*/
  852. inline int
  853. HTTPHdr::parse_req(HTTPParser * parser, const char **start, const char *end, bool eof)
  854. {
  855. ink_debug_assert(valid());
  856. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_REQUEST);
  857. return http_parser_parse_req(parser, m_heap, m_http, start, end, true, eof);
  858. }
  859. /*-------------------------------------------------------------------------
  860. -------------------------------------------------------------------------*/
  861. inline int
  862. HTTPHdr::parse_resp(HTTPParser * parser, const char **start, const char *end, bool eof)
  863. {
  864. ink_debug_assert(valid());
  865. ink_debug_assert(m_http->m_polarity == HTTP_TYPE_RESPONSE);
  866. return http_parser_parse_resp(parser, m_heap, m_http, start, end, true, eof);
  867. }
  868. /*-------------------------------------------------------------------------
  869. -------------------------------------------------------------------------*/
  870. inline bool
  871. HTTPHdr::is_cache_control_set(const char *cc_directive_wks)
  872. {
  873. ink_debug_assert(valid());
  874. ink_debug_assert(hdrtoken_is_wks(cc_directive_wks));
  875. HdrTokenHeapPrefix *prefix = hdrtoken_wks_to_prefix(cc_directive_wks);
  876. ink_debug_assert(prefix->wks_token_type == HDRTOKEN_TYPE_CACHE_CONTROL);
  877. inku32 cc_mask = prefix->wks_type_specific.u.cache_control.cc_mask;
  878. if (get_cooked_cc_mask() & cc_mask)
  879. return (true);
  880. else
  881. return (false);
  882. }
  883. /*-------------------------------------------------------------------------
  884. -------------------------------------------------------------------------*/
  885. inline bool
  886. HTTPHdr::is_pragma_no_cache_set()
  887. {
  888. ink_debug_assert(valid());
  889. return (get_cooked_pragma_no_cache());
  890. }
  891. /*-------------------------------------------------------------------------
  892. -------------------------------------------------------------------------*/
  893. enum
  894. {
  895. CACHE_ALT_MAGIC_ALIVE = 0xabcddeed,
  896. CACHE_ALT_MAGIC_MARSHALED = 0xdcbadeed,
  897. CACHE_ALT_MAGIC_DEAD = 0xdeadeed
  898. };
  899. // struct HTTPCacheAlt
  900. struct HTTPCacheAlt
  901. {
  902. HTTPCacheAlt();
  903. void copy(HTTPCacheAlt * to_copy);
  904. void destroy();
  905. inku32 m_magic;
  906. // Writeable is set to true is we reside
  907. // in a buffer owned by this structure.
  908. // INVARIENT: if own the buffer this HttpCacheAlt
  909. // we also own the buffers for the request &
  910. // response headers
  911. ink32 m_writeable;
  912. ink32 m_unmarshal_len;
  913. ink32 m_id;
  914. ink32 m_rid;
  915. ink32 m_object_key[4];
  916. ink32 m_object_size[2];
  917. HTTPHdr m_request_hdr;
  918. HTTPHdr m_response_hdr;
  919. time_t m_request_sent_time;
  920. time_t m_response_received_time;
  921. // With clustering, our alt may be in cluster
  922. // incoming channel buffer, when we are
  923. // destroyed we decrement the refcount
  924. // on that buffer so that it gets destroyed
  925. // We don't want to use a ref count ptr (Ptr<>)
  926. // since our ownership model requires explict
  927. // destroys and ref count pointers defeat this
  928. RefCountObj *m_ext_buffer;
  929. };
  930. class HTTPInfo
  931. {
  932. public:
  933. HTTPCacheAlt * m_alt;
  934. HTTPInfo();
  935. ~HTTPInfo();
  936. void create();
  937. void clear();
  938. void destroy();
  939. bool valid();
  940. void copy(HTTPInfo * to_copy);
  941. void copy_shallow(HTTPInfo * info);
  942. HTTPInfo & operator =(const HTTPInfo & m);
  943. inkcoreapi int marshal_length();
  944. inkcoreapi int marshal(char *buf, int len);
  945. static int unmarshal(char *buf, int len, RefCountObj * block_ref);
  946. void set_buffer_reference(RefCountObj * block_ref);
  947. int get_handle(char *buf, int len);
  948. ink32 id_get()
  949. {
  950. return m_alt->m_id;
  951. };
  952. ink32 rid_get()
  953. {
  954. return m_alt->m_rid;
  955. };
  956. INK_MD5 object_key_get();
  957. void object_key_get(INK_MD5 *);
  958. bool compare_object_key(const INK_MD5 *);
  959. ink64 object_size_get();
  960. void request_get(HTTPHdr * hdr)
  961. {
  962. hdr->copy_shallow(&m_alt->m_request_hdr);
  963. };
  964. void response_get(HTTPHdr * hdr)
  965. {
  966. hdr->copy_shallow(&m_alt->m_response_hdr);
  967. };
  968. HTTPHdr *request_get()
  969. {
  970. return &m_alt->m_request_hdr;
  971. };
  972. HTTPHdr *response_get()
  973. {
  974. return &m_alt->m_response_hdr;
  975. };
  976. URL *request_url_get(URL * url = NULL) {
  977. return m_alt->m_request_hdr.url_get(url);
  978. };
  979. time_t request_sent_time_get()
  980. {
  981. return m_alt->m_request_sent_time;
  982. };
  983. time_t response_received_time_get()
  984. {
  985. return m_alt->m_response_received_time;
  986. };
  987. void id_set(ink32 id)
  988. {
  989. m_alt->m_id = id;
  990. };
  991. void rid_set(ink32 id)
  992. {
  993. m_alt->m_rid = id;
  994. };
  995. void object_key_set(INK_MD5 & md5);
  996. void object_size_set(ink64 size);
  997. void request_set(const HTTPHdr * req)
  998. {
  999. m_alt->m_request_hdr.copy(req);
  1000. };
  1001. void response_set(const HTTPHdr * resp)
  1002. {
  1003. m_alt->m_response_hdr.copy(resp);
  1004. };
  1005. void request_sent_time_set(time_t t)
  1006. {
  1007. m_alt->m_request_sent_time = t;
  1008. };
  1009. void response_received_time_set(time_t t)
  1010. {
  1011. m_alt->m_response_received_time = t;
  1012. };
  1013. // Sanity check functions
  1014. static bool check_marshalled(char *buf, int len);
  1015. private:
  1016. HTTPInfo(const HTTPInfo & h);
  1017. };
  1018. inline
  1019. HTTPInfo::HTTPInfo():
  1020. m_alt(NULL)
  1021. {
  1022. }
  1023. inline
  1024. HTTPInfo::~
  1025. HTTPInfo()
  1026. {
  1027. clear();
  1028. }
  1029. inline void
  1030. HTTPInfo::clear()
  1031. {
  1032. m_alt = NULL;
  1033. }
  1034. inline void
  1035. HTTPInfo::destroy()
  1036. {
  1037. if (m_alt) {
  1038. if (m_alt->m_writeable) {
  1039. m_alt->destroy();
  1040. } else if (m_alt->m_ext_buffer) {
  1041. if (m_alt->m_ext_buffer->refcount_dec() == 0) {
  1042. m_alt->m_ext_buffer->free();
  1043. }
  1044. }
  1045. }
  1046. clear();
  1047. }
  1048. inline bool
  1049. HTTPInfo::valid()
  1050. {
  1051. return (m_alt != NULL);
  1052. }
  1053. inline void
  1054. HTTPInfo::copy_shallow(HTTPInfo * hi)
  1055. {
  1056. m_alt = hi->m_alt;
  1057. }
  1058. inline HTTPInfo &
  1059. HTTPInfo::operator =(const HTTPInfo & m)
  1060. {
  1061. m_alt = m.m_alt;
  1062. return (*this);
  1063. }
  1064. inline INK_MD5
  1065. HTTPInfo::object_key_get()
  1066. {
  1067. INK_MD5 val;
  1068. ((ink32 *) & val)[0] = m_alt->m_object_key[0];
  1069. ((ink32 *) & val)[1] = m_alt->m_object_key[1];
  1070. ((ink32 *) & val)[2] = m_alt->m_object_key[2];
  1071. ((ink32 *) & val)[3] = m_alt->m_object_key[3];
  1072. return val;
  1073. }
  1074. inline void
  1075. HTTPInfo::object_key_get(INK_MD5 * md5)
  1076. {
  1077. ((ink32 *) md5)[0] = m_alt->m_object_key[0];
  1078. ((ink32 *) md5)[1] = m_alt->m_object_key[1];
  1079. ((ink32 *) md5)[2] = m_alt->m_object_key[2];
  1080. ((ink32 *) md5)[3] = m_alt->m_object_key[3];
  1081. }
  1082. inline bool
  1083. HTTPInfo::compare_object_key(const INK_MD5 * md5)
  1084. {
  1085. return ((m_alt->m_object_key[0] == ((ink32 *) md5)[0]) &&
  1086. (m_alt->m_object_key[1] == ((ink32 *) md5)[1]) &&
  1087. (m_alt->m_object_key[2] == ((ink32 *) md5)[2]) && (m_alt->m_object_key[3] == ((ink32 *) md5)[3]));
  1088. }
  1089. inline ink64
  1090. HTTPInfo::object_size_get()
  1091. {
  1092. ink64 val;
  1093. ((ink32 *) & val)[0] = m_alt->m_object_size[0];
  1094. ((ink32 *) & val)[1] = m_alt->m_object_size[1];
  1095. return val;
  1096. }
  1097. inline void
  1098. HTTPInfo::object_key_set(INK_MD5 & md5)
  1099. {
  1100. m_alt->m_object_key[0] = ((ink32 *) & md5)[0];
  1101. m_alt->m_object_key[1] = ((ink32 *) & md5)[1];
  1102. m_alt->m_object_key[2] = ((ink32 *) & md5)[2];
  1103. m_alt->m_object_key[3] = ((ink32 *) & md5)[3];
  1104. }
  1105. inline void
  1106. HTTPInfo::object_size_set(ink64 size)
  1107. {
  1108. m_alt->m_object_size[0] = ((ink32 *) & size)[0];
  1109. m_alt->m_object_size[1] = ((ink32 *) & size)[1];
  1110. }
  1111. #endif /* __HTTP_H__ */