You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by "Roy T. Fielding" <fi...@kiwi.ICS.UCI.EDU> on 1996/10/09 02:21:29 UTC

patch for status code updates

This is Tom Romey's patch except that I have defined the full
set of HTTP/1.1 status codes, consistently, and have created a
new version of index_of_response(), and have left the status
code number in the title of error responses (I like it that way
and it avoids the magic number).

This is a prelude to a general cleaning of the response code
handling (too much direct use of numbers) and needs to be done now.
Just prior to the first beta is the only time such cleaning can be
done without interfering with problem-report patches.

.....Roy

Index: httpd.h
===================================================================
RCS file: /export/home/cvs/apache/src/httpd.h,v
retrieving revision 1.52
diff -c -r1.52 httpd.h
*** httpd.h	1996/10/08 20:43:32	1.52
--- httpd.h	1996/10/09 00:12:08
***************
*** 251,278 ****
  #define DECLINED -1		/* Module declines to handle */
  #define OK 0			/* Module has handled this stage. */
  
! /* ------------------------------ error types ------------------------------ */
  
! #define DOCUMENT_FOLLOWS 200
! #define PARTIAL_CONTENT 206
! #define MULTIPLE_CHOICES 300
! #define MOVED 301
! #define REDIRECT 302
! #define USE_LOCAL_COPY 304
! #define BAD_REQUEST 400
! #define AUTH_REQUIRED 401
! #define FORBIDDEN 403
! #define NOT_FOUND 404
! #define METHOD_NOT_ALLOWED 405
! #define NOT_ACCEPTABLE 406
! #define LENGTH_REQUIRED 411
! #define PRECONDITION_FAILED 412
! #define SERVER_ERROR 500
! #define NOT_IMPLEMENTED 501
! #define BAD_GATEWAY 502
! #define HTTP_SERVICE_UNAVAILABLE 503
! #define VARIANT_ALSO_VARIES 506
! #define RESPONSE_CODES 18
  
  #define METHODS 8
  #define M_GET 0
--- 251,317 ----
  #define DECLINED -1		/* Module declines to handle */
  #define OK 0			/* Module has handled this stage. */
  
! /* ----------------------- HTTP Status Codes  ------------------------- */
  
! #define RESPONSE_CODES 38
! 
! #define HTTP_CONTINUE                      100
! #define HTTP_SWITCHING_PROTOCOLS           101
! #define HTTP_OK                            200
! #define HTTP_CREATED                       201
! #define HTTP_ACCEPTED                      202
! #define HTTP_NON_AUTHORITATIVE             203
! #define HTTP_NO_CONTENT                    204
! #define HTTP_RESET_CONTENT                 205
! #define HTTP_PARTIAL_CONTENT               206
! #define HTTP_MULTIPLE_CHOICES              300
! #define HTTP_MOVED_PERMANENTLY             301
! #define HTTP_MOVED_TEMPORARILY             302
! #define HTTP_SEE_OTHER                     303
! #define HTTP_NOT_MODIFIED                  304
! #define HTTP_USE_PROXY                     305
! #define HTTP_BAD_REQUEST                   400
! #define HTTP_UNAUTHORIZED                  401
! #define HTTP_PAYMENT_REQUIRED              402
! #define HTTP_FORBIDDEN                     403
! #define HTTP_NOT_FOUND                     404
! #define HTTP_METHOD_NOT_ALLOWED            405
! #define HTTP_NOT_ACCEPTABLE                406
! #define HTTP_PROXY_AUTHENTICATION_REQUIRED 407
! #define HTTP_REQUEST_TIME_OUT              408
! #define HTTP_CONFLICT                      409
! #define HTTP_GONE                          410
! #define HTTP_LENGTH_REQUIRED               411
! #define HTTP_PRECONDITION_FAILED           412
! #define HTTP_REQUEST_ENTITY_TOO_LARGE      413
! #define HTTP_REQUEST_URI_TOO_LARGE         414
! #define HTTP_UNSUPPORTED_MEDIA_TYPE        415
! #define HTTP_INTERNAL_SERVER_ERROR         500
! #define HTTP_NOT_IMPLEMENTED               501
! #define HTTP_BAD_GATEWAY                   502
! #define HTTP_SERVICE_UNAVAILABLE           503
! #define HTTP_GATEWAY_TIME_OUT              504
! #define HTTP_VERSION_NOT_SUPPORTED         505
! #define HTTP_VARIANT_ALSO_VARIES           506
! 
! #define DOCUMENT_FOLLOWS    HTTP_OK
! #define PARTIAL_CONTENT     HTTP_PARTIAL_CONTENT
! #define MULTIPLE_CHOICES    HTTP_MULTIPLE_CHOICES
! #define MOVED               HTTP_MOVED_PERMANENTLY
! #define REDIRECT            HTTP_MOVED_TEMPORARILY
! #define USE_LOCAL_COPY      HTTP_NOT_MODIFIED
! #define BAD_REQUEST         HTTP_BAD_REQUEST
! #define AUTH_REQUIRED       HTTP_UNAUTHORIZED
! #define FORBIDDEN           HTTP_FORBIDDEN
! #define NOT_FOUND           HTTP_NOT_FOUND
! #define METHOD_NOT_ALLOWED  HTTP_METHOD_NOT_ALLOWED
! #define NOT_ACCEPTABLE      HTTP_NOT_ACCEPTABLE
! #define LENGTH_REQUIRED     HTTP_LENGTH_REQUIRED
! #define PRECONDITION_FAILED HTTP_PRECONDITION_FAILED
! #define SERVER_ERROR        HTTP_INTERNAL_SERVER_ERROR
! #define NOT_IMPLEMENTED     HTTP_NOT_IMPLEMENTED
! #define BAD_GATEWAY         HTTP_BAD_GATEWAY
! #define VARIANT_ALSO_VARIES HTTP_VARIANT_ALSO_VARIES
  
  #define METHODS 8
  #define M_GET 0
Index: http_protocol.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_protocol.c,v
retrieving revision 1.53
diff -c -r1.53 http_protocol.c
*** http_protocol.c	1996/10/08 21:46:59	1.53
--- http_protocol.c	1996/10/09 00:12:08
***************
*** 791,863 ****
      return OK;
  }
  
! #define RESPONSE_CODE_LIST " 200 206 300 301 302 304 400 401 403 404 405 406 411 412 500 503 501 502 506"
! 
! /* New Apache routine to map error responses into array indicies 
!  *  e.g.  400 -> 0,  500 -> 1,  502 -> 2 ...                     
!  * the indicies have no significance
   */
  
! char *status_lines[] = {
     "200 OK",
     "206 Partial Content",
     "300 Multiple Choices",
     "301 Moved Permanently",
!    "302 Found",
     "304 Not Modified",
     "400 Bad Request",
!    "401 Unauthorized",
     "403 Forbidden",
!    "404 Not found",
     "405 Method Not Allowed",
     "406 Not Acceptable",
     "411 Length Required",
     "412 Precondition Failed",
!    "500 Server error",
!    "503 Out of resources",
!    "501 Not Implemented",
     "502 Bad Gateway",
     "506 Variant Also Varies"
  }; 
  
! char *response_titles[] = {
!    "200 OK",			/* Never actually sent, barring die(200,...) */
!    "206 Partial Content",	/* Never sent as an error (we hope) */
!    "Multiple Choices",		/* 300 Multiple Choices */
!    "Document moved",		/* 301 Redirect */
!    "Document moved",		/* 302 Redirect */
!    "304 Not Modified",		/* Never sent... 304 MUST be header only */
!    "Bad Request",
!    "Authorization Required",
!    "Forbidden",
!    "File Not found",
!    "Method Not Allowed",
!    "Not Acceptable",
!    "Length Required",
!    "Precondition Failed",
!    "Server Error",
!    "Out of resources",
!    "Method not implemented",
!    "Bad Gateway",
!    "Variant Also Varies"
! };
! 
! int index_of_response(int err_no) {
!    char *cptr, err_string[10];
!    static char *response_codes = RESPONSE_CODE_LIST;
!    int index_number;
!    
!    sprintf(err_string,"%3d",err_no);
!    
!    cptr = response_codes;
!    cptr++;
!    index_number = 0;
!    while (*cptr && strncmp(cptr, err_string, 3)) { 
!       cptr += 4;
!       index_number++;
!    }
!    if (!*cptr) return -1;
!    return index_number;
  }
  
  
--- 791,874 ----
      return OK;
  }
  
! /* New Apache routine to map status codes into array indicies 
!  *  e.g.  100 -> 0,  101 -> 1,  200 -> 2 ...                     
!  * The number of status lines must equal the value of RESPONSE_CODES (httpd.h)
!  * and must be listed in order.
   */
  
! static char *status_lines[] = {
!    "100 Continue",
!    "101 Switching Protocols",
! #define LEVEL_200  2
     "200 OK",
+    "201 Created",
+    "202 Accepted",
+    "203 Non-Authoritative Information",
+    "204 No Content",
+    "205 Reset Content",
     "206 Partial Content",
+ #define LEVEL_300  9
     "300 Multiple Choices",
     "301 Moved Permanently",
!    "302 Moved Temporarily",
!    "303 See Other",
     "304 Not Modified",
+    "305 Use Proxy",
+ #define LEVEL_400 15
     "400 Bad Request",
!    "401 Authorization Required",
!    "402 Payment Required",
     "403 Forbidden",
!    "404 File Not Found",
     "405 Method Not Allowed",
     "406 Not Acceptable",
+    "407 Proxy Authentication Required",
+    "408 Request Time-out",
+    "409 Conflict",
+    "410 Gone",
     "411 Length Required",
     "412 Precondition Failed",
!    "413 Request Entity Too Large",
!    "414 Request-URI Too Large",
!    "415 Unsupported Media Type",
! #define LEVEL_500 31
!    "500 Internal Server Error",
!    "501 Method Not Implemented",
     "502 Bad Gateway",
+    "503 Service Temporarily Unavailable",
+    "504 Gateway Time-out",
+    "505 HTTP Version Not Supported",
     "506 Variant Also Varies"
  }; 
  
! /* The index is found by its offset from the x00 code of each level.
!  * Although this is fast, it will need to be replaced if some nutcase
!  * decides to define a high-numbered code before the lower numbers.
!  * If that sad event occurs, replace the code below with a linear search
!  * from status_lines[shortcut[i]] to status_lines[shortcut[i+1]-1];
!  */
! 
! int index_of_response(int status)
! {
!     static int shortcut[6] = { 0, LEVEL_200, LEVEL_300, LEVEL_400,
!                                LEVEL_500, RESPONSE_CODES+1 };
!     int i, pos;
! 
!     if (status < 100)          /* Below 100 is illegal for HTTP status */
!         return -1;
! 
!     for (i = 0; i < 5; i++) {
!         status -= 100;
!         if (status < 100) {
!             pos = (status + shortcut[i]);
!             if (pos < shortcut[i+1])
!                 return pos;
!             else
!                 return -1;     /* status unknown (falls in gap) */
!         }
!     }
!    return -1;                  /* 600 or above is also illegal */
  }
  
  
***************
*** 1365,1371 ****
            r = r->prev;
      }
      {
! 	char *title = response_titles[idx];
  	BUFF *fd = c->client;
  	
          bvputs(fd,"<HEAD><TITLE>", title, "</TITLE></HEAD>\n<BODY><H1>", title,
--- 1376,1382 ----
            r = r->prev;
      }
      {
! 	char *title = status_lines[idx];
  	BUFF *fd = c->client;
  	
          bvputs(fd,"<HEAD><TITLE>", title, "</TITLE></HEAD>\n<BODY><H1>", title,

Re: patch for status code updates

Posted by Brian Behlendorf <br...@organic.com>.
+1.

On Tue, 8 Oct 1996, Roy T. Fielding wrote:
> This is Tom Romey's patch except that I have defined the full
> set of HTTP/1.1 status codes, consistently, and have created a
> new version of index_of_response(), and have left the status
> code number in the title of error responses (I like it that way
> and it avoids the magic number).
> 
> This is a prelude to a general cleaning of the response code
> handling (too much direct use of numbers) and needs to be done now.
> Just prior to the first beta is the only time such cleaning can be
> done without interfering with problem-report patches.

	Brian

--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--
brian@organic.com  www.apache.org  hyperreal.com  http://www.organic.com/JOBS