On 09.04.2008 09:21, [EMAIL PROTECTED] wrote:
Author: pquerna
Date: Wed Apr  9 00:21:01 2008
New Revision: 646206

URL: http://svn.apache.org/viewvc?rev=646206&view=rev
Log:
Move the core serf filters to the core.

Added:
    httpd/sandbox/amsterdam/d/server/serf_filters.c
Modified:
    httpd/sandbox/amsterdam/d/build/build-modules-c.awk
    httpd/sandbox/amsterdam/d/include/http_core.h
    httpd/sandbox/amsterdam/d/server/Makefile.in


Added: httpd/sandbox/amsterdam/d/server/serf_filters.c
URL: 
http://svn.apache.org/viewvc/httpd/sandbox/amsterdam/d/server/serf_filters.c?rev=646206&view=auto
==============================================================================
--- httpd/sandbox/amsterdam/d/server/serf_filters.c (added)
+++ httpd/sandbox/amsterdam/d/server/serf_filters.c Wed Apr  9 00:21:01 2008

+
+static int serf_input_filter(ap_filter_t *f, apr_bucket_brigade *bb,
+                             ap_input_mode_t mode, apr_read_type_e block,
+                             apr_off_t readbytes)
+{
+    apr_status_t status;
+    core_net_rec *net = f->ctx;
+    serf_core_ctx_t *ctx = (serf_core_ctx_t*)net->in_ctx;
+
+    if (mode == AP_MODE_INIT) {
+        return APR_SUCCESS;
+    }
+    if (!ctx)
+    {
+        ctx = init_ctx(f, net->client_socket);
+        net->in_ctx = (void*)ctx;
+    }
+
+    if (mode == AP_MODE_GETLINE) {
+        const char *data;
+        apr_size_t len;
+        int found;
+        apr_bucket *b;
+
+        ctx->serf_bucket_status = serf_bucket_readline(ctx->serf_in_bucket,
+                                                       SERF_NEWLINE_ANY,
+                                                       &found, &data, &len);
+        b = apr_bucket_transient_create(data, len, f->c->bucket_alloc);
+        APR_BRIGADE_INSERT_TAIL(bb, b);
+        return APR_SUCCESS;

Why returning APR_SUCCESS here in all cases? What if the connection to the client got broken?

+    }
+    if (mode == AP_MODE_READBYTES) {
+        const char *data;
+        apr_size_t len;
+        apr_bucket *b;
+
+        ctx->serf_bucket_status = serf_bucket_read(ctx->serf_in_bucket,
+                                                   readbytes, &data, &len);
+        b = apr_bucket_transient_create(data, len, f->c->bucket_alloc);
+        APR_BRIGADE_INSERT_TAIL(bb, b);
+        return APR_SUCCESS;

Same as above.

+    }
+
+    if (mode == AP_MODE_SPECULATIVE) {
+        const char *data;
+        apr_size_t len;
+        apr_bucket *b;
+        serf_bucket_t *sb;
+
+        ctx->serf_bucket_status = serf_bucket_peek(ctx->serf_in_bucket,
+                                                   &data, &len);
+
+        b = apr_bucket_transient_create(data, len, f->c->bucket_alloc);
+        APR_BRIGADE_INSERT_TAIL(bb, b);
+        return APR_SUCCESS;

Same as above.

+    }
+
+    if (mode == AP_MODE_EATCRLF || mode == AP_MODE_EXHAUSTIVE) {
+        abort();

Looks like a TODO here :-).

+    }
+}
+
+static apr_status_t serf_output_filter(ap_filter_t *f,
+                                       apr_bucket_brigade *new_bb)
+{
+    apr_status_t rv;
+    serf_bucket_t *b;
+    conn_rec *c = f->c;
+    core_net_rec *net = f->ctx;
+    serf_core_ctx_t *ctx = (serf_core_ctx_t*)net->in_ctx;
+    if (!ctx) {
+        ctx = init_ctx(f, net->client_socket);
+        net->in_ctx = (void*)ctx;
+    }
+
+    if (new_bb) {
+        b = brigade_create(f, new_bb, ctx);
+        serf_bucket_aggregate_append(ctx->serf_out_bucket, b);
+        c->data_in_output_filters = 1;
+    }
+
+    if (c->data_in_output_filters && new_bb == NULL) {

How do we get in the situation where new_bb is NULL?

+        do {
+            apr_status_t srv;
+            const char *buf;
+            apr_size_t len = 0;
+
+            srv = serf_bucket_read(ctx->serf_out_bucket, SERF_READ_ALL_AVAIL,
+                                   &buf, &len);
+
+            if (SERF_BUCKET_READ_ERROR(srv)) {
+                /* bad, logme */
+                return srv;
+            }
+
+            /* write data to network here. */
+            if (len > 0) {
+                apr_size_t blen = len;
+                rv = apr_socket_send(net->client_socket, buf, &blen);
+                if (blen != len) {
+                    b = serf_bucket_simple_create(buf+blen, len - blen, NULL, 
NULL, ctx->serf_bkt_alloc);
+                    serf_bucket_aggregate_prepend(ctx->serf_out_bucket, b);
+                    srv = APR_SUCCESS;
+                }
+            }
+
+            if (APR_STATUS_IS_EOF(srv)) {
+                c->data_in_output_filters = 0;
+                break;
+            }
+            if (APR_STATUS_IS_EAGAIN(srv)) {
+                break;
+            }
+        } while (rv == APR_SUCCESS);
+    }
+
+    return APR_SUCCESS;

Is it really ok to return APR_SUCCESS in all cases?

Regards

RĂ¼diger

Reply via email to