mturk       2004/08/11 04:45:49

  Modified:    ajp/proxy proxy_ftp.c
  Log:
  Start porting connection pool to ftp.
  
  Revision  Changes    Path
  1.2       +129 -171  jakarta-tomcat-connectors/ajp/proxy/proxy_ftp.c
  
  Index: proxy_ftp.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/ajp/proxy/proxy_ftp.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- proxy_ftp.c       3 Aug 2004 10:01:18 -0000       1.1
  +++ proxy_ftp.c       11 Aug 2004 11:45:48 -0000      1.2
  @@ -19,6 +19,12 @@
   #if APR_HAVE_TIME_H
   #include <time.h>
   #endif
  +#include "apr_version.h"
  +
  +#if (APR_MAJOR_VERSION < 1)
  +#undef apr_socket_create
  +#define apr_socket_create apr_socket_create_ex
  +#endif
   
   #define AUTODETECT_PWD
   /* Automatic timestamping (Last-Modified header) based on MDTM is used if:
  @@ -31,7 +37,7 @@
   module AP_MODULE_DECLARE_DATA proxy_ftp_module;
   
   int ap_proxy_ftp_canon(request_rec *r, char *url);
  -int ap_proxy_ftp_handler(request_rec *r, proxy_server_conf *conf,
  +int ap_proxy_ftp_handler(request_rec *r, proxy_worker *worker, proxy_server_conf 
*conf,
                                char *url, const char *proxyhost,
                                apr_port_t proxyport);
   apr_status_t ap_proxy_send_dir_filter(ap_filter_t * f,
  @@ -728,7 +734,22 @@
       return HTTP_UNAUTHORIZED;
   }
   
  +static
  +apr_status_t proxy_ftp_cleanup(request_rec *r, proxy_conn_rec *backend)
  +{
  +
  +    backend->close_on_recycle = 1;
  +    ap_set_module_config(r->connection->conn_config, &proxy_ftp_module, NULL);
  +    ap_proxy_release_connection("FTP", backend, r->server);    
  +
  +    return OK;
  +}
   
  +static ftp_proxyerror(request_rec *r, proxy_conn_rec *conn, int statuscode, const 
char *message)
  +{
  +    proxy_ftp_cleanup(r, conn);
  +    return ap_proxyerror(r, statuscode, message);
  +}
   /*
    * Handles direct access of ftp:// URLs
    * Original (Non-PASV) version from
  @@ -736,7 +757,7 @@
    * PASV added by Chuck
    * Filters by [Graham Leggett <[EMAIL PROTECTED]>]
    */
  -int ap_proxy_ftp_handler(request_rec *r, proxy_server_conf *conf,
  +int ap_proxy_ftp_handler(request_rec *r, proxy_worker *worker, proxy_server_conf 
*conf,
                                char *url, const char *proxyhost,
                                apr_port_t proxyport)
   {
  @@ -747,7 +768,7 @@
       apr_sockaddr_t *connect_addr;
       apr_status_t rv;
       conn_rec *origin, *data = NULL;
  -    int err;
  +    apr_status_t err = APR_SUCCESS;
       apr_bucket_brigade *bb = apr_brigade_create(p, c->bucket_alloc);
       char *buf, *connectname;
       apr_port_t connectport;
  @@ -771,6 +792,7 @@
       /* stuff for PASV mode */
       int connect = 0, use_port = 0;
       char dates[APR_RFC822_DATE_LEN];
  +    int status;
   
       /* is this for us? */
       if (proxyhost) {
  @@ -786,18 +808,6 @@
       ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
                    "proxy: FTP: serving URL %s", url);
   
  -    /* create space for state information */
  -    backend = (proxy_conn_rec *) ap_get_module_config(c->conn_config, 
&proxy_ftp_module);
  -    if (!backend) {
  -        backend = apr_pcalloc(c->pool, sizeof(proxy_conn_rec));
  -        backend->connection = NULL;
  -        backend->hostname = NULL;
  -        backend->port = 0;
  -        ap_set_module_config(c->conn_config, &proxy_ftp_module, backend);
  -    }
  -    if (backend->connection)
  -        origin_sock = ap_get_module_config(backend->connection->conn_config, 
&core_module);
  -
   
       /*
        * I: Who Do I Connect To? -----------------------
  @@ -891,21 +901,11 @@
          "proxy: FTP: connecting %s to %s:%d", url, connectname, connectport);
   
       /* do a DNS lookup for the destination host */
  -    err = apr_sockaddr_info_get(&connect_addr, connectname, APR_UNSPEC, 
connectport, 0, p);
  -
  -    /* check if ProxyBlock directive on this host */
  -    if (OK != ap_proxy_checkproxyblock(r, conf, connect_addr)) {
  -        return ap_proxyerror(r, HTTP_FORBIDDEN,
  -                             "Connect to remote machine blocked");
  -    }
  -
  -
  -    /*
  -     * II: Make the Connection -----------------------
  -     *
  -     * We have determined who to connect to. Now make the connection.
  -     */
  -
  +    if (!worker->cp->addr)
  +        err = apr_sockaddr_info_get(&(worker->cp->addr),
  +                                    connectname, APR_UNSPEC,
  +                                    connectport, 0,
  +                                    worker->cp->pool);
       /*
        * get all the possible IP addresses for the destname and loop through
        * them until we get a successful connection
  @@ -916,105 +916,55 @@
                                                           connectname, NULL));
       }
   
  -    /*
  -     * At this point we have a list of one or more IP addresses of the
  -     * machine to connect to. If configured, reorder this list so that the
  -     * "best candidate" is first try. "best candidate" could mean the least
  -     * loaded server, the fastest responding server, whatever.
  -     *
  -     * For now we do nothing, ie we get DNS round robin. XXX FIXME
  -     */
  -
  -
  -    /* try each IP address until we connect successfully */
  -    {
  -        int failed = 1;
  -        while (connect_addr) {
  -
  -         if ((rv = apr_socket_create(&sock, connect_addr->family, SOCK_STREAM, 0, 
r->pool)) != APR_SUCCESS) {
  -             ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
  -                           "proxy: FTP: error creating socket");
  -                connect_addr = connect_addr->next;
  -             continue;
  -         }
  -
  -#if !defined(TPF) && !defined(BEOS)
  -         if (conf->recv_buffer_size > 0
  -             && (rv = apr_socket_opt_set(sock, APR_SO_RCVBUF,
  -                                            conf->recv_buffer_size))) {
  -             ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
  -                           "apr_socket_opt_set(APR_SO_RCVBUF): Failed to set 
ProxyReceiveBufferSize, using default");
  -         }
  -#endif
  -
  -         if (APR_SUCCESS != (rv = apr_socket_opt_set(sock, APR_SO_REUSEADDR, one))) 
{
  -             apr_socket_close(sock);
  -#ifndef _OSD_POSIX              /* BS2000 has this option "always on" */
  -             ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
  -                           "proxy: FTP: error setting reuseaddr option: 
apr_socket_opt_set(APR_SO_REUSEADDR)");
  -                connect_addr = connect_addr->next;
  -             continue;
  -#endif                          /* _OSD_POSIX */
  -         }
  -
  -         /* Set a timeout on the socket */
  -         if (conf->timeout_set == 1) {
  -             apr_socket_timeout_set(sock, conf->timeout);
  -         }
  -         else {
  -             apr_socket_timeout_set(sock, r->server->timeout);
  -         }
  -
  -            ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
  -                         "proxy: FTP: fam %d socket created, trying to connect to 
%pI (%s)...", 
  -                         connect_addr->family, connect_addr, connectname);
  -
  -            /* make the connection out of the socket */
  -            rv = apr_socket_connect(sock, connect_addr);
  +    /* check if ProxyBlock directive on this host */
  +    if (OK != ap_proxy_checkproxyblock(r, conf, worker->cp->addr)) {
  +        return ap_proxyerror(r, HTTP_FORBIDDEN,
  +                             "Connect to remote machine blocked");
  +    }
   
  -            /* if an error occurred, loop round and try again */
  -            if (rv != APR_SUCCESS) {
  -             apr_socket_close(sock);
  -                ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
  -                             "proxy: FTP: attempt to connect to %pI (%s) failed", 
connect_addr, connectname);
  -                connect_addr = connect_addr->next;
  -                continue;
  +    /* create space for state information */
  +    backend = (proxy_conn_rec *) ap_get_module_config(c->conn_config, 
&proxy_ftp_module);
  +    if (!backend) {
  +        status = ap_proxy_acquire_connection("FTP", &backend, worker, r->server);
  +        if (status != OK) {
  +            if (backend) {
  +                backend->close_on_recycle = 1;
  +                ap_proxy_release_connection("FTP", backend, r->server);
               }
  -
  -            /* if we get here, all is well */
  -            failed = 0;
  -            break;
  -        }
  -
  -        /* handle a permanent error from the above loop */
  -        if (failed) {
  -            return ap_proxyerror(r, HTTP_BAD_GATEWAY, apr_psprintf(r->pool,
  -                          "Could not connect to remote machine: %s port %d",
  -                                                 connectname, connectport));
  +            return status;
           }
  +        ap_set_module_config(c->conn_config, &proxy_ftp_module, backend);
       }
   
  -    /* the socket is now open, create a new connection */
  -    origin = ap_run_create_connection(p, r->server, sock, r->connection->id,
  -                                      r->connection->sbh, c->bucket_alloc);
  -    if (!origin) {
  -        /*
  -         * the peer reset the connection already; ap_run_create_connection() closed
  -         * the socket
  -         */
  +
  +    /*
  +     * II: Make the Connection -----------------------
  +     *
  +     * We have determined who to connect to. Now make the connection.
  +     */
  +
  +
  +    if (ap_proxy_connect_backend("FTP", backend, worker, r->server)) {
           ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
  -                     "proxy: FTP: an error occurred creating a new connection to 
%pI (%s)", connect_addr, connectname);
  -        return HTTP_INTERNAL_SERVER_ERROR;
  +                     "proxy: FTP: an error occurred creating a new connection to 
%pI (%s)",
  +                     worker->cp->addr, connectname);
  +        proxy_ftp_cleanup(r, backend);
  +        return HTTP_SERVICE_UNAVAILABLE;
       }
   
  -    /* if a keepalive connection is floating around, close it first! */
  -    /* we might support ftp keepalives later, but not now... */
  -    if (backend->connection) {
  -        apr_socket_close(origin_sock);
  -        backend->connection = NULL;
  -        origin_sock = NULL;
  +    if (!backend->connection) {
  +        status = ap_proxy_connection_create("FTP", backend, c, r->server);
  +        if (status != OK) {
  +            proxy_ftp_cleanup(r, backend);
  +            return status;
  +        }
       }
   
  +    /* Use old naming */
  +    origin = backend->connection;
  +    connect_addr = worker->cp->addr;
  +    sock = backend->sock;
  +
       ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
                    "proxy: FTP: control connection complete");
   
  @@ -1026,8 +976,6 @@
        * correct directory...
        */
   
  -    /* set up the connection filters */
  -    ap_run_pre_connection(origin, sock);
   
       /* possible results: */
       /* 120 Service ready in nnn minutes. */
  @@ -1035,7 +983,7 @@
       /* 421 Service not available, closing control connection. */
       rc = proxy_ftp_command(NULL, r, origin, bb, &ftpmessage);
       if (rc == -1 || rc == 421) {
  -        return ap_proxyerror(r, HTTP_BAD_GATEWAY, "Error reading from remote 
server");
  +        return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY, "Error reading from 
remote server");
       }
       if (rc == 120) {
           /*
  @@ -1061,10 +1009,10 @@
               apr_table_add(r->headers_out, "Retry-After",
                             apr_psprintf(p, "%lu", (unsigned long)(60 * secs)));
           }
  -        return ap_proxyerror(r, HTTP_SERVICE_UNAVAILABLE, ftpmessage);
  +        return ftp_proxyerror(r, backend, HTTP_SERVICE_UNAVAILABLE, ftpmessage);
       }
       if (rc != 220) {
  -        return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage);
  +        return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY, ftpmessage);
       }
   
       rc = proxy_ftp_command(apr_pstrcat(p, "USER ", user, CRLF, NULL),
  @@ -1080,18 +1028,20 @@
       /* 501 Syntax error in parameters or arguments. */
       /* 530 Not logged in. */
       if (rc == -1 || rc == 421) {
  -        return ap_proxyerror(r, HTTP_BAD_GATEWAY, "Error reading from remote 
server");
  +        return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY, "Error reading from 
remote server");
       }
       if (rc == 530) {
  +        proxy_ftp_cleanup(r, backend);
           return ftp_unauthorized(r, 1);  /* log it: user name guessing
                                            * attempt? */
       }
       if (rc != 230 && rc != 331) {
  -        return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage);
  +        return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY, ftpmessage);
       }
   
       if (rc == 331) {            /* send password */
           if (password == NULL) {
  +            proxy_ftp_cleanup(r, backend);
               return ftp_unauthorized(r, 0);
           }
   
  @@ -1106,20 +1056,21 @@
           /* 503 Bad sequence of commands. */
           /* 530 Not logged in. */
           if (rc == -1 || rc == 421) {
  -            return ap_proxyerror(r, HTTP_BAD_GATEWAY,
  -                                 "Error reading from remote server");
  +            return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY,
  +                                  "Error reading from remote server");
           }
           if (rc == 332) {
  -            return ap_proxyerror(r, HTTP_UNAUTHORIZED,
  +            return ftp_proxyerror(r, backend, HTTP_UNAUTHORIZED,
                     apr_pstrcat(p, "Need account for login: ", ftpmessage, NULL));
           }
           /* @@@ questionable -- we might as well return a 403 Forbidden here */
           if (rc == 530) {
  +            proxy_ftp_cleanup(r, backend);
               return ftp_unauthorized(r, 1);      /* log it: passwd guessing
                                                    * attempt? */
           }
           if (rc != 230 && rc != 202) {
  -            return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage);
  +            return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY, ftpmessage);
           }
       }
       apr_table_set(r->notes, "Directory-README", ftpmessage);
  @@ -1135,8 +1086,8 @@
   
           rc = proxy_ftp_command("CWD /" CRLF, r, origin, bb, &ftpmessage);
           if (rc == -1 || rc == 421)
  -            return ap_proxyerror(r, HTTP_BAD_GATEWAY,
  -                                 "Error reading from remote server");
  +            return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY,
  +                                  "Error reading from remote server");
       }
   
       /*
  @@ -1152,8 +1103,8 @@
           len = decodeenc(path); /* Note! This decodes a %2f -> "/" */
   
           if (strchr(path, '/')) { /* are there now any '/' characters? */
  -            return ap_proxyerror(r, HTTP_BAD_REQUEST,
  -                                 "Use of /%2f is only allowed at the base 
directory");
  +            return ftp_proxyerror(r, backend, HTTP_BAD_REQUEST,
  +                                  "Use of /%2f is only allowed at the base 
directory");
           }
   
           /* NOTE: FTP servers do globbing on the path.
  @@ -1174,14 +1125,14 @@
           /* 530 Not logged in. */
           /* 550 Requested action not taken. */
           if (rc == -1 || rc == 421) {
  -            return ap_proxyerror(r, HTTP_BAD_GATEWAY,
  -                                 "Error reading from remote server");
  +            return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY,
  +                                  "Error reading from remote server");
           }
           if (rc == 550) {
  -            return ap_proxyerror(r, HTTP_NOT_FOUND, ftpmessage);
  +            return ftp_proxyerror(r, backend, HTTP_NOT_FOUND, ftpmessage);
           }
           if (rc != 250) {
  -            return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage);
  +            return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY, ftpmessage);
           }
   
           path = strp + 1;
  @@ -1217,11 +1168,11 @@
           /* 502 Command not implemented. */
           /* 530 Not logged in. */
           if (rc == -1 || rc == 421) {
  -            return ap_proxyerror(r, HTTP_BAD_GATEWAY,
  -                                 "Error reading from remote server");
  +            return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY,
  +                                  "Error reading from remote server");
           }
           if (rc != 229 && rc != 500 && rc != 501 && rc != 502) {
  -            return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage);
  +            return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY, ftpmessage);
           }
           else if (rc == 229) {
               char *pstr;
  @@ -1252,6 +1203,7 @@
                   if ((rv = apr_socket_create(&data_sock, connect_addr->family, 
SOCK_STREAM, 0, r->pool)) != APR_SUCCESS) {
                       ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
                                     "proxy: FTP: error creating EPSV socket");
  +                    proxy_ftp_cleanup(r, backend);
                       return HTTP_INTERNAL_SERVER_ERROR;
                   }
   
  @@ -1272,7 +1224,7 @@
                   if (rv != APR_SUCCESS) {
                       ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
                                    "proxy: FTP: EPSV attempt to connect to %pI failed 
- Firewall/NAT?", epsv_addr);
  -                    return ap_proxyerror(r, HTTP_BAD_GATEWAY, apr_psprintf(r->pool,
  +                    return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY, 
apr_psprintf(r->pool,
                                                                              "EPSV 
attempt to connect to %pI failed - firewall/NAT?", epsv_addr));
                   }
                   else {
  @@ -1298,11 +1250,11 @@
           /* 502 Command not implemented. */
           /* 530 Not logged in. */
           if (rc == -1 || rc == 421) {
  -            return ap_proxyerror(r, HTTP_BAD_GATEWAY,
  -                                 "Error reading from remote server");
  +            return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY,
  +                                  "Error reading from remote server");
           }
           if (rc != 227 && rc != 502) {
  -            return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage);
  +            return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY, ftpmessage);
           }
           else if (rc == 227) {
               unsigned int h0, h1, h2, h3, p0, p1;
  @@ -1339,6 +1291,7 @@
                   if ((rv = apr_socket_create(&data_sock, connect_addr->family, 
SOCK_STREAM, 0, r->pool)) != APR_SUCCESS) {
                       ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
                                     "proxy: error creating PASV socket");
  +                    proxy_ftp_cleanup(r, backend);
                       return HTTP_INTERNAL_SERVER_ERROR;
                   }
   
  @@ -1357,7 +1310,7 @@
                   if (rv != APR_SUCCESS) {
                       ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
                                    "proxy: FTP: PASV attempt to connect to %pI failed 
- Firewall/NAT?", pasv_addr);
  -                    return ap_proxyerror(r, HTTP_BAD_GATEWAY, apr_psprintf(r->pool,
  +                    return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY, 
apr_psprintf(r->pool,
                                                                              "PASV 
attempt to connect to %pI failed - firewall/NAT?", pasv_addr));
                   }
                   else {
  @@ -1382,6 +1335,7 @@
           if ((rv = apr_socket_create(&local_sock, connect_addr->family, SOCK_STREAM, 
0, r->pool)) != APR_SUCCESS) {
               ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
                             "proxy: FTP: error creating local socket");
  +            proxy_ftp_cleanup(r, backend);
               return HTTP_INTERNAL_SERVER_ERROR;
           }
           apr_socket_addr_get(&local_addr, APR_LOCAL, sock);
  @@ -1393,6 +1347,7 @@
   #ifndef _OSD_POSIX              /* BS2000 has this option "always on" */
               ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
                             "proxy: FTP: error setting reuseaddr option");
  +            proxy_ftp_cleanup(r, backend);
               return HTTP_INTERNAL_SERVER_ERROR;
   #endif                          /* _OSD_POSIX */
           }
  @@ -1402,6 +1357,7 @@
           if ((rv = apr_socket_bind(local_sock, local_addr)) != APR_SUCCESS) {
               ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
               "proxy: FTP: error binding to ftp data socket %pI", local_addr);
  +            proxy_ftp_cleanup(r, backend);
               return HTTP_INTERNAL_SERVER_ERROR;
           }
   
  @@ -1409,6 +1365,7 @@
           if ((rv = apr_socket_listen(local_sock, 2)) != APR_SUCCESS) {
               ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
                             "proxy: FTP: error listening to ftp data socket %pI", 
local_addr);
  +            proxy_ftp_cleanup(r, backend);
               return HTTP_INTERNAL_SERVER_ERROR;
           }
   
  @@ -1429,11 +1386,11 @@
               /* 502 Command not implemented. */
               /* 530 Not logged in. */
               if (rc == -1 || rc == 421) {
  -                return ap_proxyerror(r, HTTP_BAD_GATEWAY,
  -                                     "Error reading from remote server");
  +                return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY,
  +                                      "Error reading from remote server");
               }
               if (rc != 200) {
  -                return ap_proxyerror(r, HTTP_BAD_GATEWAY, buffer);
  +                return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY, buffer);
               }
   
               /* signal that we must use the EPRT/PORT loop */
  @@ -1446,7 +1403,8 @@
    *   EPRT |1|132.235.1.2|6275|
    *   EPRT |2|1080::8:800:200C:417A|5282|
    */
  -            return ap_proxyerror(r, HTTP_NOT_IMPLEMENTED, "Connect to IPV6 ftp 
server using EPRT not supported. Enable EPSV.");
  +            return ftp_proxyerror(r, backend, HTTP_NOT_IMPLEMENTED,
  +                                  "Connect to IPV6 ftp server using EPRT not 
supported. Enable EPSV.");
           }
       }
   
  @@ -1461,8 +1419,8 @@
       len = decodeenc(path);
   
       if (strchr(path, '/')) { /* are there now any '/' characters? */
  -       return ap_proxyerror(r, HTTP_BAD_REQUEST,
  -                            "Use of /%2f is only allowed at the base directory");
  +       return ftp_proxyerror(r, backend, HTTP_BAD_REQUEST,
  +                             "Use of /%2f is only allowed at the base directory");
       }
   
       /* If len == 0 then it must be a directory (you can't RETR nothing)
  @@ -1492,8 +1450,8 @@
                              ftp_escape_globbingchars(p, path), CRLF, NULL),
                              r, origin, bb, &ftpmessage);
           if (rc == -1 || rc == 421) {
  -            return ap_proxyerror(r, HTTP_BAD_GATEWAY,
  -                                 "Error reading from remote server");
  +            return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY,
  +                                  "Error reading from remote server");
           }
           else if (rc == 213) {/* Size command ok */
               int j;
  @@ -1519,14 +1477,14 @@
               /* 530 Not logged in. */
               /* 550 Requested action not taken. */
               if (rc == -1 || rc == 421) {
  -                return ap_proxyerror(r, HTTP_BAD_GATEWAY,
  -                                     "Error reading from remote server");
  +                return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY,
  +                                      "Error reading from remote server");
               }
               if (rc == 550) {
  -                return ap_proxyerror(r, HTTP_NOT_FOUND, ftpmessage);
  +                return ftp_proxyerror(r, backend, HTTP_NOT_FOUND, ftpmessage);
               }
               if (rc != 250) {
  -                return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage);
  +                return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY, ftpmessage);
               }
               path = "";
               len = 0;
  @@ -1633,8 +1591,8 @@
       /* 530 Not logged in. */
       /* 550 Requested action not taken. */
       if (rc == -1 || rc == 421) {
  -        return ap_proxyerror(r, HTTP_BAD_GATEWAY,
  -                             "Error reading from remote server");
  +        return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY,
  +                              "Error reading from remote server");
       }
       if (rc == 550) {
           ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
  @@ -1656,14 +1614,14 @@
           /* 530 Not logged in. */
           /* 550 Requested action not taken. */
           if (rc == -1 || rc == 421) {
  -            return ap_proxyerror(r, HTTP_BAD_GATEWAY,
  -                                 "Error reading from remote server");
  +            return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY,
  +                                  "Error reading from remote server");
           }
           if (rc == 550) {
  -            return ap_proxyerror(r, HTTP_NOT_FOUND, ftpmessage);
  +            return ftp_proxyerror(r, backend, HTTP_NOT_FOUND, ftpmessage);
           }
           if (rc != 250) {
  -            return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage);
  +            return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY, ftpmessage);
           }
   
           /* Update current directory after CWD */
  @@ -1679,11 +1637,11 @@
   
           /* rc is an intermediate response for the LIST command (125 transfer 
starting, 150 opening data connection) */
           if (rc == -1 || rc == 421)
  -            return ap_proxyerror(r, HTTP_BAD_GATEWAY,
  -                                 "Error reading from remote server");
  +            return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY,
  +                                  "Error reading from remote server");
       }
       if (rc != 125 && rc != 150 && rc != 226 && rc != 250) {
  -        return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage);
  +        return ftp_proxyerror(r, backend, HTTP_BAD_GATEWAY, ftpmessage);
       }
   
       r->status = HTTP_OK;
  @@ -1753,6 +1711,7 @@
               else {
                   ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
                               "proxy: FTP: failed to accept data connection");
  +                proxy_ftp_cleanup(r, backend);
                   return HTTP_BAD_GATEWAY;
               }
           }
  @@ -1768,6 +1727,7 @@
            */
           ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
             "proxy: FTP: an error occurred creating the transfer connection");
  +        proxy_ftp_cleanup(r, backend);
           return HTTP_INTERNAL_SERVER_ERROR;
       }
   
  @@ -1882,10 +1842,8 @@
       /* 221 Service closing control connection. */
       /* 500 Syntax error, command unrecognized. */
       ap_flush_conn(origin);
  -    if (origin_sock) {
  -        apr_socket_close(origin_sock);
  -        origin_sock = NULL;
  -    }
  +    proxy_ftp_cleanup(r, backend);
  +
       apr_brigade_destroy(bb);
       return OK;
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to