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);
        }
       }
   
  
  
  

Reply via email to