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

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: HttpStatusLine.c,v 1.17.6.1 1999/02/12 19:38:20 wessels Exp $
  3.  *
  4.  * DEBUG: section 57    HTTP Status-line
  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. /* local constants */
  36. const char *HttpStatusLineFormat = "HTTP/%3.1f %3d %srn";
  37. void
  38. httpStatusLineInit(HttpStatusLine * sline)
  39. {
  40.     httpStatusLineSet(sline, 0.0, HTTP_STATUS_NONE, NULL);
  41. }
  42. void
  43. httpStatusLineClean(HttpStatusLine * sline)
  44. {
  45.     httpStatusLineSet(sline, 0.0, HTTP_INTERNAL_SERVER_ERROR, NULL);
  46. }
  47. /* set values */
  48. void
  49. httpStatusLineSet(HttpStatusLine * sline, double version, http_status status, const char *reason)
  50. {
  51.     assert(sline);
  52.     sline->version = version;
  53.     sline->status = status;
  54.     /* Note: no xstrdup for 'reason', assumes constant 'reasons' */
  55.     sline->reason = reason;
  56. }
  57. /* parse a 0-terminating buffer and fill internal structures; returns true on success */
  58. void
  59. httpStatusLinePackInto(const HttpStatusLine * sline, Packer * p)
  60. {
  61.     assert(sline && p);
  62.     debug(57, 9) ("packing sline %p using %p:n", sline, p);
  63.     debug(57, 9) (HttpStatusLineFormat, sline->version, sline->status,
  64. sline->reason ? sline->reason : httpStatusString(sline->status));
  65.     packerPrintf(p, HttpStatusLineFormat,
  66. sline->version, sline->status, httpStatusLineReason(sline));
  67. }
  68. /* pack fields using Packer */
  69. int
  70. httpStatusLineParse(HttpStatusLine * sline, const char *start, const char *end)
  71. {
  72.     assert(sline);
  73.     sline->status = HTTP_INVALID_HEADER; /* Squid header parsing error */
  74.     if (strncasecmp(start, "HTTP/", 5))
  75. return 0;
  76.     start += 5;
  77.     if (!xisdigit(*start))
  78. return 0;
  79.     sline->version = atof(start);
  80.     if (!(start = strchr(start, ' ')))
  81. return 0;
  82.     sline->status = atoi(++start);
  83.     /* we ignore 'reason-phrase' */
  84.     return 1; /* success */
  85. }
  86. const char *
  87. httpStatusLineReason(const HttpStatusLine * sline)
  88. {
  89.     assert(sline);
  90.     return sline->reason ? sline->reason : httpStatusString(sline->status);
  91. }
  92. const char *
  93. httpStatusString(http_status status)
  94. {
  95.     /* why not to return matching string instead of using "p" ? @?@ */
  96.     const char *p = NULL;
  97.     switch (status) {
  98.     case 0:
  99. p = "Init"; /* we init .status with code 0 */
  100. break;
  101.     case HTTP_CONTINUE:
  102. p = "Continue";
  103. break;
  104.     case HTTP_SWITCHING_PROTOCOLS:
  105. p = "Switching Protocols";
  106. break;
  107.     case HTTP_OK:
  108. p = "OK";
  109. break;
  110.     case HTTP_CREATED:
  111. p = "Created";
  112. break;
  113.     case HTTP_ACCEPTED:
  114. p = "Accepted";
  115. break;
  116.     case HTTP_NON_AUTHORITATIVE_INFORMATION:
  117. p = "Non-Authoritative Information";
  118. break;
  119.     case HTTP_NO_CONTENT:
  120. p = "No Content";
  121. break;
  122.     case HTTP_RESET_CONTENT:
  123. p = "Reset Content";
  124. break;
  125.     case HTTP_PARTIAL_CONTENT:
  126. p = "Partial Content";
  127. break;
  128.     case HTTP_MULTIPLE_CHOICES:
  129. p = "Multiple Choices";
  130. break;
  131.     case HTTP_MOVED_PERMANENTLY:
  132. p = "Moved Permanently";
  133. break;
  134.     case HTTP_MOVED_TEMPORARILY:
  135. p = "Moved Temporarily";
  136. break;
  137.     case HTTP_SEE_OTHER:
  138. p = "See Other";
  139. break;
  140.     case HTTP_NOT_MODIFIED:
  141. p = "Not Modified";
  142. break;
  143.     case HTTP_USE_PROXY:
  144. p = "Use Proxy";
  145. break;
  146.     case HTTP_BAD_REQUEST:
  147. p = "Bad Request";
  148. break;
  149.     case HTTP_UNAUTHORIZED:
  150. p = "Unauthorized";
  151. break;
  152.     case HTTP_PAYMENT_REQUIRED:
  153. p = "Payment Required";
  154. break;
  155.     case HTTP_FORBIDDEN:
  156. p = "Forbidden";
  157. break;
  158.     case HTTP_NOT_FOUND:
  159. p = "Not Found";
  160. break;
  161.     case HTTP_METHOD_NOT_ALLOWED:
  162. p = "Method Not Allowed";
  163. break;
  164.     case HTTP_NOT_ACCEPTABLE:
  165. p = "Not Acceptable";
  166. break;
  167.     case HTTP_PROXY_AUTHENTICATION_REQUIRED:
  168. p = "Proxy Authentication Required";
  169. break;
  170.     case HTTP_REQUEST_TIMEOUT:
  171. p = "Request Time-out";
  172. break;
  173.     case HTTP_CONFLICT:
  174. p = "Conflict";
  175. break;
  176.     case HTTP_GONE:
  177. p = "Gone";
  178. break;
  179.     case HTTP_LENGTH_REQUIRED:
  180. p = "Length Required";
  181. break;
  182.     case HTTP_PRECONDITION_FAILED:
  183. p = "Precondition Failed";
  184. break;
  185.     case HTTP_REQUEST_ENTITY_TOO_LARGE:
  186. p = "Request Entity Too Large";
  187. break;
  188.     case HTTP_REQUEST_URI_TOO_LARGE:
  189. p = "Request-URI Too Large";
  190. break;
  191.     case HTTP_UNSUPPORTED_MEDIA_TYPE:
  192. p = "Unsupported Media Type";
  193. break;
  194.     case HTTP_INTERNAL_SERVER_ERROR:
  195. p = "Internal Server Error";
  196. break;
  197.     case HTTP_NOT_IMPLEMENTED:
  198. p = "Not Implemented";
  199. break;
  200.     case HTTP_BAD_GATEWAY:
  201. p = "Bad Gateway";
  202. break;
  203.     case HTTP_SERVICE_UNAVAILABLE:
  204. p = "Service Unavailable";
  205. break;
  206.     case HTTP_GATEWAY_TIMEOUT:
  207. p = "Gateway Time-out";
  208. break;
  209.     case HTTP_HTTP_VERSION_NOT_SUPPORTED:
  210. p = "HTTP Version not supported";
  211. break;
  212.     default:
  213. p = "Unknown";
  214. debug(57, 3) ("Unknown HTTP status code: %dn", status);
  215. break;
  216.     }
  217.     return p;
  218. }