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

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: HttpMsg.c,v 1.6 1998/08/18 03:07:05 wessels Exp $
  3.  *
  4.  * DEBUG: section 74    HTTP Message
  5.  * AUTHOR: Alex Rousskov
  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. /* find end of headers */
  36. int
  37. httpMsgIsolateHeaders(const char **parse_start, const char **blk_start, const char **blk_end)
  38. {
  39.     /*
  40.      * parse_start points to the first line of HTTP message *headers*,
  41.      * not including the request or status lines
  42.      */
  43.     size_t l = strlen(*parse_start);
  44.     size_t end = headersEnd(*parse_start, l);
  45.     int nnl;
  46.     if (end) {
  47. *blk_start = *parse_start;
  48. *blk_end = *parse_start + end - 1;
  49. /*
  50.  * leave blk_end pointing to the first character after the
  51.  * first newline which terminates the headers
  52.  */
  53. assert(**blk_end == 'n');
  54. while (*(*blk_end - 1) == 'r')
  55.     (*blk_end)--;
  56. assert(*(*blk_end - 1) == 'n');
  57. *parse_start += end;
  58. return 1;
  59.     }
  60.     /*
  61.      * If we didn't find the end of headers, and parse_start does
  62.      * NOT point to a CR or NL character, then return failure
  63.      */
  64.     if (**parse_start != 'r' && **parse_start != 'n')
  65. return 0; /* failure */
  66.     /*
  67.      * If we didn't find the end of headers, and parse_start does point
  68.      * to an empty line, then we have empty headers.  Skip all CR and
  69.      * NL characters up to the first NL.  Leave parse_start pointing at
  70.      * the first character after the first NL.
  71.      */
  72.     *blk_start = *parse_start;
  73.     *blk_end = *blk_start;
  74.     for (nnl = 0; nnl == 0; (*parse_start)++) {
  75. if (**parse_start == 'r')
  76.     (void) 0;
  77. else if (**parse_start == 'n')
  78.     nnl++;
  79. else
  80.     break;
  81.     }
  82.     return 1;
  83. }
  84. /* returns true if connection should be "persistent" 
  85.  * after processing this message */
  86. int
  87. httpMsgIsPersistent(float http_ver, const HttpHeader * hdr)
  88. {
  89.     if (http_ver >= 1.1) {
  90. /*
  91.  * for modern versions of HTTP: persistent unless there is
  92.  * a "Connection: close" header.
  93.  */
  94. return !httpHeaderHasConnDir(hdr, "close");
  95.     } else {
  96. /*
  97.  * Persistent connections in Netscape 3.x are allegedly broken,
  98.  * return false if it is a browser connection.  If there is a
  99.  * VIA header, then we assume this is NOT a browser connection.
  100.  */
  101. const char *agent = httpHeaderGetStr(hdr, HDR_USER_AGENT);
  102. if (agent && !httpHeaderHas(hdr, HDR_VIA)) {
  103.     if (!strncasecmp(agent, "Mozilla/3.", 10))
  104. return 0;
  105.     if (!strncasecmp(agent, "Netscape/3.", 11))
  106. return 0;
  107. }
  108. /* for old versions of HTTP: persistent if has "keep-alive" */
  109. return httpHeaderHasConnDir(hdr, "keep-alive");
  110.     }
  111. }