Commit c91b14ab authored by Graham Leggett's avatar Graham Leggett
Browse files

FTP directory filter works now.

Many FIXME notes added.
Much overhauling of proxy_ftp.c
PR:
Obtained from:
Reviewed by:


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@88817 13f79535-47bb-0310-9956-ffa450edef68
parent a6e02d9e
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -410,8 +410,6 @@ static void * create_proxy_config(apr_pool_t *p, server_rec *s)
    ps->noproxies = ap_make_array(p, 10, sizeof(struct noproxy_entry));
    ps->dirconn = ap_make_array(p, 10, sizeof(struct dirconn_entry));
    ps->allowed_connect_ports = ap_make_array(p, 10, sizeof(int));
/*    ps->client_socket = NULL;*/
    ps->connection = NULL;
    ps->domain = NULL;
    ps->viaopt = via_off; /* initially backward compatible with 1.3.1 */
    ps->viaopt_set = 0; /* 0 means default */
@@ -721,7 +719,7 @@ static void register_hooks(apr_pool_t *p)
    /* filename-to-URI translation */
    ap_hook_translate_name(proxy_trans, NULL, NULL, APR_HOOK_FIRST);
    /* filters */
    ap_register_output_filter("PROXY_SEND_DIR", ap_proxy_send_dir_filter, AP_FTYPE_CONNECTION);
    ap_register_output_filter("PROXY_SEND_DIR", ap_proxy_send_dir_filter, AP_FTYPE_CONTENT);
    /* fixups */
    ap_hook_fixups(proxy_fixup, NULL, NULL, APR_HOOK_FIRST);
    /* post read_request handling */
+3 −7
Original line number Diff line number Diff line
@@ -167,11 +167,6 @@ typedef struct {
    apr_array_header_t *noproxies;
    apr_array_header_t *dirconn;
    apr_array_header_t *allowed_connect_ports;
    long id;
    const char *connectname;
    apr_port_t connectport;
/*    apr_socket_t *client_socket;*/
    conn_rec *connection;
    const char *domain;		/* domain name to use in absence of a domain name in the request */
    int req;			/* true if proxy requests are enabled */
    char req_set;
@@ -215,7 +210,8 @@ int ap_proxy_connect_handler(request_rec *r, char *url,

int ap_proxy_ftp_canon(request_rec *r, char *url);
int ap_proxy_ftp_handler(request_rec *r, char *url);
apr_status_t ap_proxy_send_dir_filter(ap_filter_t *f, apr_bucket_brigade *bb);
apr_status_t ap_proxy_send_dir_filter(ap_filter_t *f,
				      apr_bucket_brigade *bb);


/* proxy_http.c */
@@ -248,7 +244,7 @@ int ap_proxy_is_hostname(struct dirconn_entry *This, apr_pool_t *p);
int ap_proxy_is_word(struct dirconn_entry *This, apr_pool_t *p);
int ap_proxy_checkproxyblock(request_rec *r, proxy_server_conf *conf, apr_sockaddr_t *uri_addr);
int ap_proxy_pre_http_connection(conn_rec *c, request_rec *r);
apr_status_t ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb, char *buff, size_t bufflen);
apr_status_t ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb, char *buff, size_t bufflen, int *eos);
void ap_proxy_reset_output_filters(conn_rec *c);

#endif /*MOD_PROXY_H*/
+300 −146

File changed.

Preview size limit exceeded, changes collapsed.

+4 −2
Original line number Diff line number Diff line
@@ -175,7 +175,7 @@ int ap_proxy_http_handler(request_rec *r, char *url,
    apr_sockaddr_t *connect_addr;
    char server_portstr[32];
    apr_socket_t *sock;
    int i, len, backasswards, close=0, failed=0, new=0;
    int i, len, backasswards, eos, close=0, failed=0, new=0;
    apr_status_t err, rv;
    apr_array_header_t *headers_in_array;
    apr_table_entry_t *headers_in;
@@ -587,7 +587,7 @@ int ap_proxy_http_handler(request_rec *r, char *url,

    apr_brigade_cleanup(bb);

    if (APR_SUCCESS != (rv = ap_proxy_string_read(origin, bb, buffer, sizeof(buffer)))) {
    if (APR_SUCCESS != (rv = ap_proxy_string_read(origin, bb, buffer, sizeof(buffer), &eos))) {
	apr_socket_close(sock);
	backend->connection = NULL;
	ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
@@ -733,6 +733,8 @@ int ap_proxy_http_handler(request_rec *r, char *url,
	/* read the body, pass it to the output filters */
	while (ap_get_brigade(rp->input_filters, bb, AP_MODE_BLOCKING) == APR_SUCCESS) {
	    if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb))) {
		e = apr_bucket_flush_create();
		APR_BRIGADE_INSERT_TAIL(bb, e);
		ap_pass_brigade(r->output_filters, bb);
		break;
	    }
+6 −1
Original line number Diff line number Diff line
@@ -1082,7 +1082,8 @@ int ap_proxy_pre_http_connection(conn_rec *c, request_rec *r)
}

/* converts a series of buckets into a string */
apr_status_t ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb, char *buff, size_t bufflen)
apr_status_t ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb,
				  char *buff, size_t bufflen, int *eos)
{
    apr_bucket *e;
    apr_status_t rv;
@@ -1093,6 +1094,7 @@ apr_status_t ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb, char *buf

    /* start with an empty string */
    buff[0] = 0;
    *eos = 0;

    /* get line-at-a-time */
    c->remain = 0;
@@ -1108,6 +1110,9 @@ apr_status_t ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb, char *buf
	/* loop through each bucket */
	while (!found && !APR_BRIGADE_EMPTY(bb)) {
	    e = APR_BRIGADE_FIRST(bb);
	    if (APR_BUCKET_IS_EOS(e)) {
		*eos = 1;
	    }
	    if (APR_SUCCESS != apr_bucket_read(e, (const char **)&response, &len, APR_BLOCK_READ)) {
		return rv;
	    }