You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by co...@locus.apache.org on 2000/08/10 13:22:59 UTC

cvs commit: apache-2.0/src/main http_protocol.c http_request.c

coar        00/08/10 04:22:58

  Modified:    src      CHANGES
               src/include http_request.h httpd.h
               src/main http_protocol.c http_request.c
  Log:
  	Add support for arbitrary extension methods for the Allow
  	response header field, and an API routine for modifying the
  	allowed list in a unified manner for both known and extension
  	methods.
  
  Revision  Changes    Path
  1.197     +4 -0      apache-2.0/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/CHANGES,v
  retrieving revision 1.196
  retrieving revision 1.197
  diff -u -u -r1.196 -r1.197
  --- CHANGES	2000/08/09 20:47:05	1.196
  +++ CHANGES	2000/08/10 11:22:54	1.197
  @@ -1,4 +1,8 @@
   Changes with Apache 2.0a6
  +  *) Add support for extension methods for the Allow response header
  +     field, and an API routine for accessing r->allowed and the
  +     list of extension methods in a unified manner.  [Ken Coar]
  +
     *) mod_cern_meta: fix broken file reading loop in scan_meta_file().
        [Rob Simonson <si...@us.ibm.com>]
   
  
  
  
  1.14      +17 -1     apache-2.0/src/include/http_request.h
  
  Index: http_request.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/include/http_request.h,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -u -r1.13 -r1.14
  --- http_request.h	2000/08/02 05:25:29	1.13
  +++ http_request.h	2000/08/10 11:22:55	1.14
  @@ -106,7 +106,23 @@
   API_EXPORT(int) ap_some_auth_required(request_rec *r);
   API_EXPORT(int) ap_is_initial_req(request_rec *r);
   API_EXPORT(void) ap_update_mtime(request_rec *r, apr_time_t dependency_mtime);
  -
  +/**
  + * Add one or more methods to the list permitted to access the resource.
  + * Usually executed by the content handler before the response header is
  + * sent, but sometimes invoked at an earlier phase if a module knows it
  + * can set the list authoritatively.  Note that the methods are ADDED
  + * to any already permitted unless the reset flag is non-zero.  The
  + * list is used to generate the Allow response header field when it
  + * is needed.
  + * @param   r     The pointer to the request identifying the resource.
  + * @param   reset Boolean flag indicating whether this list should
  + *                completely replace any current settings.
  + * @param   ...   A NULL-terminated list of strings, each identifying a
  + *                method name to add.
  + * @return  None.
  + * @deffunc void ap_allow_methods(request_rec *r, int reset, ...)
  + */
  +API_EXPORT(void) ap_allow_methods(request_rec *r, int reset, ...);
   #ifdef CORE_PRIVATE
   /* Function called by main.c to handle first-level request */
   void ap_process_request(request_rec *);
  
  
  
  1.73      +1 -0      apache-2.0/src/include/httpd.h
  
  Index: httpd.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/include/httpd.h,v
  retrieving revision 1.72
  retrieving revision 1.73
  diff -u -u -r1.72 -r1.73
  --- httpd.h	2000/08/10 11:07:26	1.72
  +++ httpd.h	2000/08/10 11:22:55	1.73
  @@ -666,6 +666,7 @@
        *  handler can't be installed by mod_actions. </PRE>
        */
       int allowed;		/* Allowed methods - for 405, OPTIONS, etc */
  +    apr_array_header_t *allowed_xmethods; /* Array of extension methods */
   
       /** byte count in stream is for body */
       int sent_bodyct;
  
  
  
  1.102     +35 -17    apache-2.0/src/main/http_protocol.c
  
  Index: http_protocol.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/main/http_protocol.c,v
  retrieving revision 1.101
  retrieving revision 1.102
  diff -u -u -r1.101 -r1.102
  --- http_protocol.c	2000/08/06 06:07:34	1.101
  +++ http_protocol.c	2000/08/10 11:22:56	1.102
  @@ -1572,23 +1572,41 @@
    */
   static char *make_allow(request_rec *r)
   {
  -    return 2 + apr_pstrcat(r->pool,
  -                   (r->allowed & (1 << M_GET))       ? ", GET, HEAD" : "",
  -                   (r->allowed & (1 << M_POST))      ? ", POST"      : "",
  -                   (r->allowed & (1 << M_PUT))       ? ", PUT"       : "",
  -                   (r->allowed & (1 << M_DELETE))    ? ", DELETE"    : "",
  -                   (r->allowed & (1 << M_CONNECT))   ? ", CONNECT"   : "",
  -                   (r->allowed & (1 << M_OPTIONS))   ? ", OPTIONS"   : "",
  -                   (r->allowed & (1 << M_PATCH))     ? ", PATCH"     : "",
  -                   (r->allowed & (1 << M_PROPFIND))  ? ", PROPFIND"  : "",
  -                   (r->allowed & (1 << M_PROPPATCH)) ? ", PROPPATCH" : "",
  -                   (r->allowed & (1 << M_MKCOL))     ? ", MKCOL"     : "",
  -                   (r->allowed & (1 << M_COPY))      ? ", COPY"      : "",
  -                   (r->allowed & (1 << M_MOVE))      ? ", MOVE"      : "",
  -                   (r->allowed & (1 << M_LOCK))      ? ", LOCK"      : "",
  -                   (r->allowed & (1 << M_UNLOCK))    ? ", UNLOCK"    : "",
  -                   ", TRACE",
  -                   NULL);
  +    char *list;
  +
  +    list = apr_pstrcat(r->pool,
  +		       (r->allowed & (1 << M_GET))       ? ", GET, HEAD" : "",
  +		       (r->allowed & (1 << M_POST))      ? ", POST"      : "",
  +		       (r->allowed & (1 << M_PUT))       ? ", PUT"       : "",
  +		       (r->allowed & (1 << M_DELETE))    ? ", DELETE"    : "",
  +		       (r->allowed & (1 << M_CONNECT))   ? ", CONNECT"   : "",
  +		       (r->allowed & (1 << M_OPTIONS))   ? ", OPTIONS"   : "",
  +		       (r->allowed & (1 << M_PATCH))     ? ", PATCH"     : "",
  +		       (r->allowed & (1 << M_PROPFIND))  ? ", PROPFIND"  : "",
  +		       (r->allowed & (1 << M_PROPPATCH)) ? ", PROPPATCH" : "",
  +		       (r->allowed & (1 << M_MKCOL))     ? ", MKCOL"     : "",
  +		       (r->allowed & (1 << M_COPY))      ? ", COPY"      : "",
  +		       (r->allowed & (1 << M_MOVE))      ? ", MOVE"      : "",
  +		       (r->allowed & (1 << M_LOCK))      ? ", LOCK"      : "",
  +		       (r->allowed & (1 << M_UNLOCK))    ? ", UNLOCK"    : "",
  +		       ", TRACE",
  +		       NULL);
  +    if ((r->allowed & (1 << M_INVALID)) && (r->allowed_xmethods->nelts)) {
  +	int i;
  +	char **xmethod = (char **) r->allowed_xmethods->elts;
  +
  +	/*
  +	 * Append all of the elements of r->allowed_xmethods
  +	 */
  +	for (i = 0; i < r->allowed_xmethods->nelts; ++i) {
  +	    list = ap_pstrcat(r->pool, list, ", ", xmethod[i], NULL);
  +	}
  +    }
  +    /*
  +     * Space past the leading ", ".  Wastes two bytes, but that's better
  +     * than futzing around to find the actual length.
  +     */
  +    return list + 2;
   }
   
   API_EXPORT(int) ap_send_http_trace(request_rec *r)
  
  
  
  1.40      +46 -0     apache-2.0/src/main/http_request.c
  
  Index: http_request.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/main/http_request.c,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -u -r1.39 -r1.40
  --- http_request.c	2000/08/06 06:07:35	1.39
  +++ http_request.c	2000/08/10 11:22:57	1.40
  @@ -79,6 +79,9 @@
   #include "apr_strings.h"
   #include "apr_file_io.h"
   #include "apr_fnmatch.h"
  +#ifdef APR_HAVE_STDARG_H
  +#include <stdarg.h>
  +#endif
   
   AP_HOOK_STRUCT(
   	    AP_HOOK_LINK(translate_name)
  @@ -1423,5 +1426,48 @@
   {
       if (r->mtime < dependency_mtime) {
   	r->mtime = dependency_mtime;
  +    }
  +}
  +
  +API_EXPORT(void) ap_allow_methods(request_rec *r, int reset, ...) {
  +    int mnum;
  +    const char *method;
  +    const char **xmethod;
  +    va_list methods;
  +
  +    /*
  +     * Get rid of any current settings if requested; not just the
  +     * well-known methods but any extensions as well.
  +     */
  +    if (reset) {
  +	r->allowed = 0;
  +	if (r->allowed_xmethods != NULL) {
  +	    r->allowed_xmethods->nelts = 0;
  +	}
  +    }
  +
  +    va_start(methods, reset);
  +    while ((method = va_arg(methods, const char *)) != NULL) {
  +	/*
  +	 * Look up our internal number for this particular method.
  +	 * Even if it isn't one of the ones we know about, the return
  +	 * value is used in the same way.
  +	 */
  +	mnum = ap_method_number_of(method);
  +	r->allowed |= (1 << mnum);
  +	/*
  +	 * Now, if we don't know about it, we regard it as an
  +	 * extension method.  Add it to our array of such.  This means
  +	 * that anything that checks for M_INVALID needs to make an
  +	 * additional check of this array if it *is* invalid.
  +	 */
  +	if (mnum == M_INVALID) {
  +	    if (r->allowed_xmethods == NULL) {
  +		r->allowed_xmethods = apr_make_array(r->pool, 2,
  +						     sizeof(char *));
  +	    }
  +	    xmethod = (const char **) apr_push_array(r->allowed_xmethods);
  +	    *xmethod = method;
  +	}
       }
   }