You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by Roy Fielding <fi...@hyperreal.com> on 1996/10/10 11:02:48 UTC

cvs commit: apache/src httpd.h http_protocol.c

fielding    96/10/10 02:02:46

  Modified:    src       httpd.h http_protocol.c
  Log:
  Added definitions and status lines for all HTTP/1.1 status codes.
  Improved the speed of the index_of_response() routine.
  Reviewed by: Brian Behlendorf, Chuck Murcko
  Submitted by: Tom Tromey (with major modifications by Roy)
  
  Revision  Changes    Path
  1.53      +61 -22    apache/src/httpd.h
  
  Index: httpd.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/httpd.h,v
  retrieving revision 1.52
  retrieving revision 1.53
  diff -C3 -r1.52 -r1.53
  *** httpd.h	1996/10/08 20:43:32	1.52
  --- httpd.h	1996/10/10 09:02:43	1.53
  ***************
  *** 50,56 ****
     *
     */
    
  ! /* $Id: httpd.h,v 1.52 1996/10/08 20:43:32 brian Exp $ */
    
    /*
     * httpd.h: header for simple (ha! not anymore) http daemon
  --- 50,56 ----
     *
     */
    
  ! /* $Id: httpd.h,v 1.53 1996/10/10 09:02:43 fielding Exp $ */
    
    /*
     * httpd.h: header for simple (ha! not anymore) http daemon
  ***************
  *** 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
  
  
  
  1.54      +62 -51    apache/src/http_protocol.c
  
  Index: http_protocol.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_protocol.c,v
  retrieving revision 1.53
  retrieving revision 1.54
  diff -C3 -r1.53 -r1.54
  *** http_protocol.c	1996/10/08 21:46:59	1.53
  --- http_protocol.c	1996/10/10 09:02:43	1.54
  ***************
  *** 50,56 ****
     *
     */
      
  ! /* $Id: http_protocol.c,v 1.53 1996/10/08 21:46:59 brian Exp $ */
    
    /*
     * http_protocol.c --- routines which directly communicate with the
  --- 50,56 ----
     *
     */
      
  ! /* $Id: http_protocol.c,v 1.54 1996/10/10 09:02:43 fielding Exp $ */
    
    /*
     * http_protocol.c --- routines which directly communicate with the
  ***************
  *** 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,