You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by pq...@apache.org on 2008/12/12 09:24:29 UTC

svn commit: r725942 - /httpd/httpd/trunk/modules/proxy/mod_proxy_fdpass.c

Author: pquerna
Date: Fri Dec 12 00:24:28 2008
New Revision: 725942

URL: http://svn.apache.org/viewvc?rev=725942&view=rev
Log:
Convert the flushing mechanism used before passing the socket to be based on a provider, and include a default one using a flush.

Modified:
    httpd/httpd/trunk/modules/proxy/mod_proxy_fdpass.c

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_fdpass.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_fdpass.c?rev=725942&r1=725941&r2=725942&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy_fdpass.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy_fdpass.c Fri Dec 12 00:24:28 2008
@@ -27,6 +27,15 @@
 /* for apr_wait_for_io_or_timeout */
 #include "apr_support.h"
 
+#define PROXY_FDPASS_FLUSHER "proxy_fdpass_flusher"
+
+typedef struct proxy_fdpass_flush proxy_fdpass_flush;
+struct proxy_fdpass_flush {
+    const char *name;
+    int (*flusher)(request_rec *r);
+    void            *context;
+};
+
 module AP_MODULE_DECLARE_DATA proxy_fdpass_module;
 
 static int proxy_fdpass_canon(request_rec *r, char *url)
@@ -190,26 +199,21 @@
         return HTTP_INTERNAL_SERVER_ERROR;
     }
 
-    r->connection->keepalive = AP_CONN_CLOSE;
-
-    /* TODO: Make this part a provider, so you can send a custom body / headers,
-     * before passing the client off to the socket. 
-     */
     {
         int status;
-        apr_bucket_brigade *bb;
-        apr_bucket *e;
+        const char *flush_method = "flush";
 
-        bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
-        e = apr_bucket_flush_create(r->connection->bucket_alloc);
+        proxy_fdpass_flush *flush = ap_lookup_provider(PROXY_FDPASS_FLUSHER, flush_method, "0");
 
-        APR_BRIGADE_INSERT_TAIL(bb, e);
+        if (!flush) {
+            ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
+                          "proxy: FD: Unable to find configured flush "
+                          "provider '%s'", flush_method);
+            return HTTP_INTERNAL_SERVER_ERROR;
+        }
 
-        status = ap_pass_brigade(r->output_filters, bb);
-        
-        if (status != OK) {
-            ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r,
-                          "proxy: FD: ap_pass_brigade failed:");
+        status = flush->flusher(r);
+        if (status) {
             return status;
         }
     }
@@ -244,8 +248,41 @@
     return OK;
 }
 
+static int standard_flush(request_rec *r)
+{
+    int status;
+    apr_bucket_brigade *bb;
+    apr_bucket *e;
+
+    r->connection->keepalive = AP_CONN_CLOSE;
+
+    bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
+    e = apr_bucket_flush_create(r->connection->bucket_alloc);
+    
+    APR_BRIGADE_INSERT_TAIL(bb, e);
+
+    status = ap_pass_brigade(r->output_filters, bb);
+
+    if (status != OK) {
+        ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r,
+                      "proxy: FD: ap_pass_brigade failed:");
+        return status;
+    }
+
+    return OK;
+}
+
+
+static const proxy_fdpass_flush builtin_flush =
+{
+    "flush",
+    &standard_flush,
+    NULL
+};
+
 static void register_hooks(apr_pool_t *p)
 {
+    ap_register_provider(p, PROXY_FDPASS_FLUSHER, "flush", "0", &builtin_flush);
     proxy_hook_scheme_handler(proxy_fdpass_handler, NULL, NULL, APR_HOOK_FIRST);
     proxy_hook_canon_handler(proxy_fdpass_canon, NULL, NULL, APR_HOOK_FIRST);
 }