rse 98/03/20 01:11:15
Modified: . STATUS
src CHANGES
src/modules/proxy proxy_ftp.c
Log:
The proxy module now uses the already determined response of
the FTP SITE command to provide a Content-Length header for FTP requests.
Submitted by: Ralf S. Engelschall
PR#: 1183
Revision Changes Path
1.200 +2 -1 apache-1.3/STATUS
Index: STATUS
===================================================================
RCS file: /export/home/cvs/apache-1.3/STATUS,v
retrieving revision 1.199
retrieving revision 1.200
diff -u -r1.199 -r1.200
--- STATUS 1998/03/20 07:56:47 1.199
+++ STATUS 1998/03/20 09:11:06 1.200
@@ -99,7 +99,8 @@
* Ralf's additional manual pages for the support programs
* Ben Hyde's Configure check for unknown command switch
* Martin's fix for src/helpers/fp2rp
- * Ralf's reanimation of an undocumented directive: ProxyReceiveBufferSize
+ * Ralf's reanim. of (undocumented) directive: ProxyReceiveBufferSize,
PR#1348
+ * Ralf's mod_proxy fix to use FTP SIZE response for Content-Length,
PR#1183
Available Patches:
1.726 +4 -0 apache-1.3/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v
retrieving revision 1.725
retrieving revision 1.726
diff -u -r1.725 -r1.726
--- CHANGES 1998/03/20 07:56:51 1.725
+++ CHANGES 1998/03/20 09:11:12 1.726
@@ -1,5 +1,9 @@
Changes with Apache 1.3b6
+ *) Now mod_proxy uses the reponse string (in addition to the response
status
+ code) from the already used FTP SIZE command to setup the Content-Length
+ header if available. [Ralf S. Engelschall, PR#1183]
+
*) Reanimated the (still undocumented) proxy receive buffer size directive:
Renamed from ReceiveBufferSize to ProxyReceiveBufferSize because the old
name was really too generic, added documentation for this directive to
1.52 +59 -2 apache-1.3/src/modules/proxy/proxy_ftp.c
Index: proxy_ftp.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/modules/proxy/proxy_ftp.c,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -r1.51 -r1.52
--- proxy_ftp.c 1998/03/20 07:56:55 1.51
+++ proxy_ftp.c 1998/03/20 09:11:14 1.52
@@ -213,6 +213,47 @@
return status;
}
+/*
+ * Like ftp_getrc but returns both the ftp status code and
+ * remembers the response message in the supplied buffer
+ */
+static int ftp_getrc_msg(BUFF *f, char *msgbuf, int msglen)
+{
+ int len, status;
+ char linebuff[100], buff[5];
+ char *mb = msgbuf;
+ int ml = msglen;
+
+ len = bgets(linebuff, 100, f);
+ if (len == -1)
+ return -1;
+ if (len < 5 || !isdigit(linebuff[0]) || !isdigit(linebuff[1]) ||
+ !isdigit(linebuff[2]) || (linebuff[3] != ' ' && linebuff[3] != '-'))
+ status = 0;
+ else
+ status = 100 * linebuff[0] + 10 * linebuff[1] + linebuff[2] - 111 * '0';
+
+ mb = ap_cpystrn(mb, linebuff+4, len-4 < ml ? len-4 : ml);
+
+ if (linebuff[len - 1] != '\n')
+ (void)bskiplf(f);
+
+ if (linebuff[3] == '-') {
+ memcpy(buff, linebuff, 3);
+ buff[3] = ' ';
+ do {
+ len = bgets(linebuff, 100, f);
+ if (len == -1)
+ return -1;
+ if (linebuff[len - 1] != '\n') {
+ (void)bskiplf(f);
+ }
+ mb = ap_cpystrn(mb, linebuff+4, len-4 < ml ? len-4 : ml);
+ } while (memcmp(linebuff, buff, 4) != 0);
+ }
+ return status;
+}
+
static long int send_dir(BUFF *f, request_rec *r, BUFF *f2, struct cache_req
*c, char *url)
{
char buf[IOBUFSIZE];
@@ -441,11 +482,20 @@
char pasv[64];
char *pstr;
+/* stuff for responses */
+ char *resp;
+ int resplen;
+ char *size = NULL;
+
/* we only support GET and HEAD */
if (r->method_number != M_GET)
return NOT_IMPLEMENTED;
+/* allocate a buffer for the response message */
+ resplen = MAX_STRING_LEN;
+ resp = (char *)palloc(r->pool, resplen);
+
/* We break the URL into host, port, path-search */
host = pstrdup(p, url + 6);
@@ -833,8 +883,8 @@
bputs(CRLF, f);
bflush(f);
Explain1("FTP: SIZE %s", path);
- i = ftp_getrc(f);
- Explain1("FTP: returned status %d", i);
+ i = ftp_getrc_msg(f, resp, resplen);
+ Explain2("FTP: returned status %d with response %s", i, resp);
if (i != 500) { /* Size command not recognized */
if (i == 550) { /* Not a regular file */
Explain0("FTP: SIZE shows this is a directory");
@@ -861,6 +911,9 @@
path = "";
len = 0;
}
+ else if (i == 213) { /* Size command ok */
+ size = resp;
+ }
}
}
@@ -935,6 +988,10 @@
}
else {
proxy_add_header(resp_hdrs, "Content-Type", "text/plain", HDR_REP);
+ }
+ if (size != NULL) {
+ proxy_add_header(resp_hdrs, "Content-Length", size, HDR_REP);
+ Explain1("FTP: Content-Length set to %s", size);
}
}