mod_proxy_fdpass.c revision 7184de27ec1d62a83c41cdeac0953ca9fd661e8c
842ae4bd224140319ae7feec1872b93dfd491143fielding/* Licensed to the Apache Software Foundation (ASF) under one or more
842ae4bd224140319ae7feec1872b93dfd491143fielding * contributor license agreements. See the NOTICE file distributed with
842ae4bd224140319ae7feec1872b93dfd491143fielding * this work for additional information regarding copyright ownership.
842ae4bd224140319ae7feec1872b93dfd491143fielding * The ASF licenses this file to You under the Apache License, Version 2.0
842ae4bd224140319ae7feec1872b93dfd491143fielding * (the "License"); you may not use this file except in compliance with
842ae4bd224140319ae7feec1872b93dfd491143fielding * the License. You may obtain a copy of the License at
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * Unless required by applicable law or agreed to in writing, software
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * distributed under the License is distributed on an "AS IS" BASIS,
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * See the License for the specific language governing permissions and
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * limitations under the License.
9d129b55f5a43abf43865c6b0eb6dd19bc22aba8ianh#error This module only works on unix platforms with the correct OS support
fcc25eda7b150e226d3c1cdaea66a943d3fdee4erbb/* for apr_wait_for_io_or_timeout */
2d2eda71267231c2526be701fe655db125852c1ffieldingstatic int proxy_fdpass_canon(request_rec *r, char *url)
52de7a47876ce1748910cf3a0ee97f78842fab54rederpj const char *path;
fd492f9543f14fb5bae78e04b135c3448eb9cc56rbb r->filename = apr_pstrcat(r->pool, "proxy:fd://", path, NULL);
61fd0cab072a05b855cbef9c585702401ac5ae29rbb/* TODO: In APR 2.x: Extend apr_sockaddr_t to possibly be a path !!! */
61fd0cab072a05b855cbef9c585702401ac5ae29rbbstatic apr_status_t socket_connect_un(apr_socket_t *sock,
61fd0cab072a05b855cbef9c585702401ac5ae29rbb if ((rv == -1) && (errno == EINPROGRESS || errno == EALREADY)
61fd0cab072a05b855cbef9c585702401ac5ae29rbb && (t > 0)) {
2d2eda71267231c2526be701fe655db125852c1ffieldingstatic apr_status_t get_socket_from_path(apr_pool_t *p,
000b67449410515eac43e76ef6667915bfd4d2abgstein const char* path,
d82d78a97558238d16c52ec5278fe921bb7d7ec3brianp char b = '\0';
2d2eda71267231c2526be701fe655db125852c1ffieldingstatic int proxy_fdpass_handler(request_rec *r, proxy_worker *worker,
61fd0cab072a05b855cbef9c585702401ac5ae29rbb "proxy: FD: Failed to connect to '%s'",
61fd0cab072a05b855cbef9c585702401ac5ae29rbb const char *flush_method = worker->s->flusher ? worker->s->flusher : "flush";
61fd0cab072a05b855cbef9c585702401ac5ae29rbb proxy_fdpass_flush *flush = ap_lookup_provider(PROXY_FDPASS_FLUSHER,
2d2eda71267231c2526be701fe655db125852c1ffielding "proxy: FD: Unable to find configured flush "
62db15de4c1f335a64d45821796ae197cff94ef8rbb /* XXXXX: THIS IS AN EVIL HACK */
48d2edbfb84e5559b5da0f8d614ccab805cc67a8rbb /* There should really be a (documented) public API for this ! */
62db15de4c1f335a64d45821796ae197cff94ef8rbb clientsock = ap_get_core_module_config(r->connection->conn_config);
62db15de4c1f335a64d45821796ae197cff94ef8rbb "proxy: FD: send_socket failed:");
62db15de4c1f335a64d45821796ae197cff94ef8rbb /* Create a dummy unconnected socket, and set it as the one we were
48d2edbfb84e5559b5da0f8d614ccab805cc67a8rbb * connected to, so that when the core closes it, it doesn't close
48d2edbfb84e5559b5da0f8d614ccab805cc67a8rbb * the tcp connection to the client.
91f0d8da77152d24e4bbb31ce199282b3fd6e3b2coar rv = apr_socket_create(&dummy, APR_INET, SOCK_STREAM, APR_PROTO_TCP,
91f0d8da77152d24e4bbb31ce199282b3fd6e3b2coar "proxy: FD: failed to create dummy socket");
91f0d8da77152d24e4bbb31ce199282b3fd6e3b2coar ap_set_core_module_config(r->connection->conn_config, dummy);
91f0d8da77152d24e4bbb31ce199282b3fd6e3b2coar bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
91f0d8da77152d24e4bbb31ce199282b3fd6e3b2coar e = apr_bucket_flush_create(r->connection->bucket_alloc);
91f0d8da77152d24e4bbb31ce199282b3fd6e3b2coar "proxy: FD: ap_pass_brigade failed:");
3d96ee83babeec32482c9082c9426340cee8c44dwrowe ap_register_provider(p, PROXY_FDPASS_FLUSHER, "flush", "0", &builtin_flush);
91f0d8da77152d24e4bbb31ce199282b3fd6e3b2coar proxy_hook_scheme_handler(proxy_fdpass_handler, NULL, NULL, APR_HOOK_FIRST);