Commit 28e92fac authored by Ryan Bloom's avatar Ryan Bloom
Browse files

filters can now report an HTTP error to the server. This is done

by sending a brigade where the first bucket is an error_bucket.
This bucket is a simple bucket that stores an HTTP error and
a string.  Currently the string is not used, but it may be needed
to output an error log.  The http_header_filter will find this
bucket, and output the error text, and then return
AP_FILTER_ERROR, which informs the server that the error web page
has already been sent.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@87863 13f79535-47bb-0310-9956-ffa450edef68
parent d19e995e
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
Changes with Apache 2.0b1

  *) filters can now report an HTTP error to the server.  This is done
     by sending a brigade where the first bucket is an error_bucket.
     This bucket is a simple bucket that stores an HTTP error and
     a string.  Currently the string is not used, but it may be needed
     to output an error log.  The http_header_filter will find this
     bucket, and output the error text, and then return 
     AP_FILTER_ERROR, which informs the server that the error web page
     has already been sent.  [Ryan Bloom]

  *) If we get an error, then we should remove all filters except for
     those critical to serving a web page.  This fixes a bug, where
     error pages were going through the byterange filter, even though
+42 −0
Original line number Diff line number Diff line
@@ -59,9 +59,11 @@
#ifndef APACHE_HTTP_PROTOCOL_H
#define APACHE_HTTP_PROTOCOL_H

#include "httpd.h"
#include "apr_hooks.h"
#include "apr_portable.h"
#include "apr_mmap.h"
#include "apr_buckets.h"

#ifdef __cplusplus
extern "C" {
@@ -550,6 +552,46 @@ AP_DECLARE_HOOK(const char *,http_method,(const request_rec *))
 */
AP_DECLARE_HOOK(apr_port_t,default_port,(const request_rec *))

typedef struct ap_bucket_error ap_bucket_error;
/**
 * A bucket referring to an HTTP error
 * This bucket can be passed down the filter stack to indicate that an
 * HTTP error occurred while running a filter.  In order for this bucket
 * to be used successfully, it MUST be sent as the first bucket in the
 * first brigade to be sent from a given filter.
 */
struct ap_bucket_error {
    /** The start of the data actually allocated.  This should never be
     * modified, it is only used to free the bucket.
     */
    char    *start;
};

extern const apr_bucket_type_t ap_bucket_type_error;

/**
 * Make the bucket passed in an error bucket
 * @param b The bucket to make into an error bucket
 * @param error The HTTP error code to put in the bucket. 
 * @param buf An optional error string to put in the bucket.
 * @param p A pool to allocate out of.
 * @return The new bucket, or NULL if allocation failed
 * @deffunc apr_bucket *ap_bucket_make_error(apr_bucket *b, int error, const char *buf, apr_pool_t *p)
 */
AP_DECLARE(apr_bucket *) ap_bucket_make_error(apr_bucket *b, int error,
                const char *buf, apr_pool_t *p);

/**
 * Create a bucket referring to an HTTP error.
 * @param error The HTTP error code to put in the bucket. 
 * @param buf An optional error string to put in the bucket.
 * @param p A pool to allocate out of.
 * @return The new bucket, or NULL if allocation failed
 * @deffunc apr_bucket *ap_bucket_create_error(int error, const char *buf, apr_pool_t *p)
 */
AP_DECLARE(apr_bucket *) ap_bucket_create_error(int error,
                const char *buf, apr_pool_t *p);

#ifdef __cplusplus
}
#endif
+1 −0
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ extern "C" {

#define AP_NOBODY_WROTE         -1
#define AP_NOBODY_READ          -2
#define AP_FILTER_ERROR         -3

/* ap_input_mode_t - input filtering modes 
 * 
+1 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@ dnl modules enabled in this directory by default

APACHE_MODPATH_INIT(http)

http_objects="http_core.lo http_protocol.lo http_request.lo"
http_objects="http_core.lo http_protocol.lo http_request.lo error_bucket.lo"

APACHE_MODULE(core, HTTP protocol handling, $http_objects, , yes)
APACHE_MODULE(mime, mapping of file-extension to MIME, , , yes)
+1 −0
Original line number Diff line number Diff line
@@ -3516,6 +3516,7 @@ static apr_status_t core_output_filter(ap_filter_t *f, apr_bucket_brigade *b)
static void core_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp)
{
    apr_init_bucket_types(pconf);
    apr_insert_bucket_type(&ap_bucket_type_error);
}

static void core_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
Loading