You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by gs...@apache.org on 2002/03/01 04:25:50 UTC

cvs commit: httpd-2.0/modules/dav/main mod_dav.c mod_dav.h util.c

gstein      02/02/28 19:25:50

  Modified:    modules/dav/main mod_dav.c mod_dav.h util.c
  Log:
  Give mod_dav the ability to output both standard and customized
  <D:error> responses.  It's crucial for marshalling svn error messages
  back over to the client; and someday it will be needed to return
  specific <DAV:> errors as dictated by the DeltaV spec.
  
  * mod_dav.h (dav_error): add two new fields -- an optional error
      namespace, and an error-tag-name.  Remove the 'delayed computation'
      function and cxt ptrs in this struct;  they were never used.
  
    (dav_new_error_tag):  new alternative constructor that takes new
      fields.
  
  * util.c (dav_new_error_tag):  implement constructor.
  
  * mod_dav.c (dav_error_response_tag):  new function to output
      'standard' xml error response based on error struct.
  
    (dav_handle_err): if no multistatus response is passed in, and if an
      error-tag is defined, then call our new xml-output routine.
  
  Submitted by: Ben Collins-Sussman <su...@collab.net>
  
  Revision  Changes    Path
  1.70      +68 -1     httpd-2.0/modules/dav/main/mod_dav.c
  
  Index: mod_dav.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/dav/main/mod_dav.c,v
  retrieving revision 1.69
  retrieving revision 1.70
  diff -u -r1.69 -r1.70
  --- mod_dav.c	9 Feb 2002 01:57:38 -0000	1.69
  +++ mod_dav.c	1 Mar 2002 03:25:49 -0000	1.70
  @@ -363,7 +363,10 @@
   static int dav_error_response(request_rec *r, int status, const char *body)
   {
       r->status = status;
  -    r->status_line = ap_get_status_line(status);	/* ### needed? */
  +
  +    /* ### I really don't think this is needed; gotta test */
  +    r->status_line = ap_get_status_line(status);
  +
       r->content_type = "text/html";
   
       /* since we're returning DONE, ensure the request body is consumed. */
  @@ -389,6 +392,63 @@
       return DONE;
   }
   
  +
  +/*
  + * Send a "standardized" error response based on the error's namespace & tag
  + */
  +static int dav_error_response_tag(request_rec *r, 
  +                                  dav_error *err)
  +{
  +    r->status = err->status;
  +
  +    /* ### I really don't think this is needed; gotta test */
  +    r->status_line = ap_get_status_line(err->status);
  +
  +    r->content_type = DAV_XML_CONTENT_TYPE;
  +
  +    /* since we're returning DONE, ensure the request body is consumed. */
  +    (void) ap_discard_request_body(r);
  +
  +    ap_rputs(DAV_XML_HEADER DEBUG_CR
  +             "<D:error xmlns:D=\"DAV:\"", r);
  +
  +    if (err->desc != NULL) {
  +        /* ### should move this namespace somewhere (with the others!) */
  +        ap_rputs(" xmlns:m=\"http://apache.org/dav/xmlns\"", r);
  +    }
  +
  +    if (err->namespace != NULL) {
  +        ap_rprintf(r,
  +                   " xmlns:C=\"%s\">" DEBUG_CR
  +                   "<C:%s/>" DEBUG_CR,
  +                   err->namespace, err->tagname);
  +    }
  +    else {
  +        ap_rprintf(r,
  +                   ">" DEBUG_CR
  +                   "<D:%s/>" DEBUG_CR, err->tagname);
  +    }
  +    
  +    /* here's our mod_dav specific tag: */
  +    if (err->desc != NULL) {
  +        ap_rprintf(r, 
  +                   "<m:human-readable errcode=\"%d\">" DEBUG_CR
  +                   "%s" DEBUG_CR
  +                   "</m:human-readable>" DEBUG_CR,
  +                   err->error_id,
  +                   apr_xml_quote_string(r->pool, err->desc, 0));
  +    }
  +
  +    ap_rputs("</D:error>" DEBUG_CR, r);
  +
  +    /* the response has been sent. */
  +    /*
  +     * ### Use of DONE obviates logging..!
  +     */
  +    return DONE;
  +}
  +
  +
   /*
   ** Apache's URI escaping does not replace '&' since that is a valid character
   ** in a URI (to form a query section). We must explicitly handle it so that
  @@ -533,6 +593,13 @@
       if (response == NULL) {
   	/* our error messages are safe; tell Apache this */
   	apr_table_setn(r->notes, "verbose-error-to", "*");
  +
  +        /* didn't get a multistatus response passed in, but we still
  +           might be able to generate a standard <D:error> response. */
  +        if (err->tagname) {
  +            return dav_error_response_tag(r, err);
  +        }
  +
   	return err->status;
       }
   
  
  
  
  1.57      +15 -6     httpd-2.0/modules/dav/main/mod_dav.h
  
  Index: mod_dav.h
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/dav/main/mod_dav.h,v
  retrieving revision 1.56
  retrieving revision 1.57
  diff -u -r1.56 -r1.57
  --- mod_dav.h	9 Feb 2002 01:57:38 -0000	1.56
  +++ mod_dav.h	1 Mar 2002 03:25:49 -0000	1.57
  @@ -158,13 +158,10 @@
   
       int save_errno;		/* copy of errno causing the error */
   
  -    struct dav_error *prev;	/* previous error (in stack) */
  +    const char *namespace;      /* [optional] namespace of error */
  +    const char *tagname;        /* name of error-tag */
   
  -    /* deferred computation of the description */
  -    void (*compute_desc)(struct dav_error *err, apr_pool_t *p);
  -    int ctx_i;
  -    const char *ctx_s;
  -    void *ctx_p;
  +    struct dav_error *prev;	/* previous error (in stack) */
   
   } dav_error;
   
  @@ -174,6 +171,18 @@
   */
   DAV_DECLARE(dav_error*) dav_new_error(apr_pool_t *p, int status, 
                                         int error_id, const char *desc);
  +
  +
  +/*
  +** Create a new error structure with tagname and (optional) namespace;
  +** namespace may be NULL, which means "DAV:". save_errno will be
  +** filled with the current errno value.
  +*/
  +DAV_DECLARE(dav_error*) dav_new_error_tag(apr_pool_t *p, int status, 
  +                                          int error_id, const char *desc,
  +                                          const char *namespace,
  +                                          const char *tagname);
  +
   
   /*
   ** Push a new error description onto the stack of errors.
  
  
  
  1.37      +14 -0     httpd-2.0/modules/dav/main/util.c
  
  Index: util.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/dav/main/util.c,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- util.c	22 Jan 2002 19:00:22 -0000	1.36
  +++ util.c	1 Mar 2002 03:25:49 -0000	1.37
  @@ -87,6 +87,20 @@
       return err;
   }
   
  +DAV_DECLARE(dav_error*) dav_new_error_tag(apr_pool_t *p, int status, 
  +                                          int error_id, const char *desc,
  +                                          const char *namespace,
  +                                          const char *tagname)
  +{
  +    dav_error *err = dav_new_error(p, status, error_id, desc);
  +
  +    err->tagname = tagname;
  +    err->namespace = namespace;
  +
  +    return err;
  +}
  +
  +
   DAV_DECLARE(dav_error*) dav_push_error(apr_pool_t *p, int status, 
                                          int error_id, const char *desc, 
                                          dav_error *prev)