HttpRequest.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:4k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: HttpRequest.c,v 1.23 1999/01/29 23:39:11 wessels Exp $
  3.  *
  4.  * DEBUG: section 73    HTTP Request
  5.  * AUTHOR: Duane Wessels
  6.  *
  7.  * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/
  8.  * ----------------------------------------------------------
  9.  *
  10.  *  Squid is the result of efforts by numerous individuals from the
  11.  *  Internet community.  Development is led by Duane Wessels of the
  12.  *  National Laboratory for Applied Network Research and funded by the
  13.  *  National Science Foundation.  Squid is Copyrighted (C) 1998 by
  14.  *  Duane Wessels and the University of California San Diego.  Please
  15.  *  see the COPYRIGHT file for full details.  Squid incorporates
  16.  *  software developed and/or copyrighted by other sources.  Please see
  17.  *  the CREDITS file for full details.
  18.  *
  19.  *  This program is free software; you can redistribute it and/or modify
  20.  *  it under the terms of the GNU General Public License as published by
  21.  *  the Free Software Foundation; either version 2 of the License, or
  22.  *  (at your option) any later version.
  23.  *  
  24.  *  This program is distributed in the hope that it will be useful,
  25.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27.  *  GNU General Public License for more details.
  28.  *  
  29.  *  You should have received a copy of the GNU General Public License
  30.  *  along with this program; if not, write to the Free Software
  31.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
  32.  *
  33.  */
  34. #include "squid.h"
  35. request_t *
  36. requestCreate(method_t method, protocol_t protocol, const char *urlpath)
  37. {
  38.     request_t *req = memAllocate(MEM_REQUEST_T);
  39.     req->method = method;
  40.     req->protocol = protocol;
  41.     if (urlpath)
  42. stringReset(&req->urlpath, urlpath);
  43.     req->max_forwards = -1;
  44.     httpHeaderInit(&req->header, hoRequest);
  45.     return req;
  46. }
  47. void
  48. requestDestroy(request_t * req)
  49. {
  50.     assert(req);
  51.     safe_free(req->body);
  52.     safe_free(req->canonical);
  53.     stringClean(&req->urlpath);
  54.     httpHeaderClean(&req->header);
  55.     if (req->cache_control)
  56. httpHdrCcDestroy(req->cache_control);
  57.     if (req->range)
  58. httpHdrRangeDestroy(req->range);
  59.     memFree(req, MEM_REQUEST_T);
  60. }
  61. request_t *
  62. requestLink(request_t * request)
  63. {
  64.     assert(request);
  65.     request->link_count++;
  66.     return request;
  67. }
  68. void
  69. requestUnlink(request_t * request)
  70. {
  71.     if (!request)
  72. return;
  73.     assert(request->link_count > 0);
  74.     if (--request->link_count > 0)
  75. return;
  76.     requestDestroy(request);
  77. }
  78. int
  79. httpRequestParseHeader(request_t * req, const char *parse_start)
  80. {
  81.     const char *blk_start, *blk_end;
  82.     if (!httpMsgIsolateHeaders(&parse_start, &blk_start, &blk_end))
  83. return 0;
  84.     return httpHeaderParse(&req->header, blk_start, blk_end);
  85. }
  86. /* swaps out request using httpRequestPack */
  87. void
  88. httpRequestSwapOut(const request_t * req, StoreEntry * e)
  89. {
  90.     Packer p;
  91.     assert(req && e);
  92.     packerToStoreInit(&p, e);
  93.     httpRequestPack(req, &p);
  94.     packerClean(&p);
  95. }
  96. /* packs request-line and headers, appends <crlf> terminator */
  97. void
  98. httpRequestPack(const request_t * req, Packer * p)
  99. {
  100.     assert(req && p);
  101.     /* pack request-line */
  102.     packerPrintf(p, "%s %s HTTP/1.0rn",
  103. RequestMethodStr[req->method], strBuf(req->urlpath));
  104.     /* headers */
  105.     httpHeaderPackInto(&req->header, p);
  106.     /* trailer */
  107.     packerAppend(p, "rn", 2);
  108. }
  109. #if UNUSED_CODE
  110. void
  111. httpRequestSetHeaders(request_t * req, method_t method, const char *uri, const char *header_str)
  112. {
  113.     assert(req && uri && header_str);
  114.     assert(!req->header.len);
  115.     httpHeaderParse(&req->header, header_str, header_str + strlen(header_str));
  116. }
  117. #endif
  118. /* returns the length of request line + headers + crlf */
  119. int
  120. httpRequestPrefixLen(const request_t * req)
  121. {
  122.     assert(req);
  123.     return strlen(RequestMethodStr[req->method]) + 1 +
  124. strLen(req->urlpath) + 1 +
  125. 4 + 1 + 3 + 2 +
  126. req->header.len + 2;
  127. }
  128. /* returns true if header is allowed to be passed on */
  129. int
  130. httpRequestHdrAllowed(const HttpHeaderEntry * e, String * strConn)
  131. {
  132.     assert(e);
  133.     /* check with anonymizer tables */
  134.     if (CBIT_TEST(Config.anonymize_headers, e->id))
  135. return 0;
  136.     /* check connection header */
  137.     if (strConn && strListIsMember(strConn, strBuf(e->name), ','))
  138. return 0;
  139.     return 1;
  140. }