dgaudet     99/06/18 12:20:50

  Modified:    mpm/src/include buff.h
               mpm/src/main buff.c http_protocol.c
  Log:
  break chunked encoding, ebcdic, ... layering goes here
  
  Revision  Changes    Path
  1.2       +4 -48     apache-2.0/mpm/src/include/buff.h
  
  Index: buff.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/mpm/src/include/buff.h,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- buff.h    1999/06/18 18:39:28     1.1
  +++ buff.h    1999/06/18 19:20:47     1.2
  @@ -62,10 +62,6 @@
   extern "C" {
   #endif
   
  -#ifdef B_SFIO
  -#include "sfio.h"
  -#endif
  -
   #include <stdarg.h>
   
   /* Reading is buffered */
  @@ -85,16 +81,13 @@
   #undef B_ERROR
   #endif
   #define B_ERROR (48)
  -/* Use chunked writing */
  -#define B_CHUNK (64)
  +/* TODO: implement chunked encoding as a layer */
   /* bflush() if a read would block */
   #define B_SAFEREAD (128)
   /* buffer is a socket */
   #define B_SOCKET (256)
  -#ifdef CHARSET_EBCDIC
  -#define B_ASCII2EBCDIC 0x40000000  /* Enable conversion for this buffer */
  -#define B_EBCDIC2ASCII 0x80000000  /* Enable conversion for this buffer */
  -#endif /*CHARSET_EBCDIC*/
  +
  +/* TODO: implement a ebcdic/ascii conversion layers */
   
   typedef struct buff_struct BUFF;
   
  @@ -103,7 +96,6 @@
       unsigned char *inptr;    /* pointer to next location to read */
       int incnt;                       /* number of bytes left to read from 
input buffer;
                                 * always 0 if had a read error  */
  -    int outchunk;            /* location of chunk header when chunking */
       int outcnt;                      /* number of byte put in output buffer 
*/
       unsigned char *inbase;
       unsigned char *outbase;
  @@ -116,29 +108,9 @@
   
   /* could also put pointers to the basic I/O routines here */
       int fd;                  /* the file descriptor */
  -#ifdef WIN32
  -    HANDLE hFH;                      /* Windows filehandle */
  -#endif
       time_t timeout;          /* timeout for B_SOCKET operations */
  -
  -    /* transport handle, for RPC binding handle or some such */
  -    void *t_handle;
  -
  -#ifdef B_SFIO
  -    Sfio_t *sf_in;
  -    Sfio_t *sf_out;
  -#endif
   };
   
  -#ifdef B_SFIO
  -typedef struct {
  -    Sfdisc_t disc;
  -    BUFF *buff;
  -} apache_sfio;
  -
  -extern Sfdisc_t *bsfio_new(pool *p, BUFF *b);
  -#endif
  -
   /* Options to bset/getopt */
   #define BO_BYTECT (1)
   #define BO_TIMEOUT (2)
  @@ -150,9 +122,6 @@
   /* XXX - unused right now - mvsk */
   API_EXPORT(BUFF *) ap_bopenf(pool *a, const char *name, int flg, int mode);
   
  -#ifdef WIN32
  -API_EXPORT(void) ap_bpushh(BUFF *fb, HANDLE hFH);
  -#endif
   API_EXPORT(int) ap_bsetopt(BUFF *fb, int optname, const void *optval);
   API_EXPORT(int) ap_bgetopt(BUFF *fb, int optname, void *optval);
   API_EXPORT(int) ap_bsetflag(BUFF *fb, int flag, int value);
  @@ -181,27 +150,14 @@
   API_EXPORT(int) ap_bflsbuf(int c, BUFF *fb);
   API_EXPORT(int) ap_bfilbuf(BUFF *fb);
   
  -#ifndef CHARSET_EBCDIC
  -
   #define ap_bgetc(fb)   ( ((fb)->incnt == 0) ? ap_bfilbuf(fb) : \
                    ((fb)->incnt--, *((fb)->inptr++)) )
   
   #define ap_bputc(c, fb) ((((fb)->flags & (B_EOUT|B_WRERR|B_WR)) != B_WR || \
                     (fb)->outcnt == (fb)->bufsiz) ? ap_bflsbuf(c, (fb)) : \
                     ((fb)->outbase[(fb)->outcnt++] = (c), 0))
  -
  -#else /*CHARSET_EBCDIC*/
  -
  -#define ap_bgetc(fb)   ( ((fb)->incnt == 0) ? ap_bfilbuf(fb) : \
  -                 ((fb)->incnt--, (fb->flags & B_ASCII2EBCDIC)\
  -                 ?os_toebcdic[(unsigned 
char)*((fb)->inptr++)]:*((fb)->inptr++)) )
  -
  -#define ap_bputc(c, fb) ((((fb)->flags & (B_EOUT|B_WRERR|B_WR)) != B_WR || \
  -                  (fb)->outcnt == (fb)->bufsiz) ? ap_bflsbuf(c, (fb)) : \
  -                  ((fb)->outbase[(fb)->outcnt++] = (fb->flags & 
B_EBCDIC2ASCII)\
  -                  ?os_toascii[(unsigned char)c]:(c), 0))
   
  -#endif /*CHARSET_EBCDIC*/
  +/* XXX: this doesn't belong here... should be part of a generic spawning API 
in APR/NSPR */
   struct child_info {
   #ifdef WIN32
       /*
  
  
  
  1.2       +11 -417   apache-2.0/mpm/src/main/buff.c
  
  Index: buff.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/mpm/src/main/buff.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- buff.c    1999/06/18 18:39:29     1.1
  +++ buff.c    1999/06/18 19:20:48     1.2
  @@ -75,12 +75,6 @@
   #ifndef DEFAULT_BUFSIZE
   #define DEFAULT_BUFSIZE (4096)
   #endif
  -/* This must be enough to represent (DEFAULT_BUFSIZE - 3) in hex,
  - * plus two extra characters.
  - */
  -#ifndef CHUNK_HEADER_SIZE
  -#define CHUNK_HEADER_SIZE (5)
  -#endif
   
   
   /* bwrite()s of greater than this size can result in a large_write() call,
  @@ -219,37 +213,21 @@
       else
        fb->inbase = NULL;
   
  -    /* overallocate so that we can put a chunk trailer of CRLF into this
  -     * buffer */
       if (flags & B_WR)
  -     fb->outbase = ap_palloc(p, fb->bufsiz + 2);
  +     fb->outbase = ap_palloc(p, fb->bufsiz);
       else
        fb->outbase = NULL;
   
  -#ifdef CHARSET_EBCDIC
  -    fb->flags |= (flags & B_SOCKET) ? (B_EBCDIC2ASCII | B_ASCII2EBCDIC) : 0;
  -#endif /*CHARSET_EBCDIC*/
  -
       fb->inptr = fb->inbase;
   
       fb->incnt = 0;
       fb->outcnt = 0;
  -    fb->outchunk = -1;
       fb->error = NULL;
       fb->bytes_sent = 0;
   
       fb->fd = -1;
       fb->timeout = -1;
   
  -#ifdef B_SFIO
  -    fb->sf_in = NULL;
  -    fb->sf_out = NULL;
  -    fb->sf_in = sfnew(fb->sf_in, NIL(Void_t *),
  -                   (size_t) SF_UNBOUND, 0, SF_READ);
  -    fb->sf_out = sfnew(fb->sf_out, NIL(Void_t *),
  -                    (size_t) SF_UNBOUND, 1, SF_WRITE);
  -#endif
  -
       return fb;
   }
   
  @@ -298,105 +276,17 @@
   
   static int bflush_core(BUFF *fb);
   
  -/*
  - * Start chunked encoding.
  - *
  - * Note that in order for ap_bputc() to be an efficient macro we have to 
guarantee
  - * that start_chunk() has always been called on the buffer before we leave 
any
  - * routine in this file.  Said another way, if a routine here uses 
end_chunk()
  - * and writes something on the wire, then it has to call start_chunk() or set
  - * an error condition before returning.
  - */
  -static void start_chunk(BUFF *fb)
  -{
  -    if (fb->outchunk != -1) {
  -     /* already chunking */
  -     return;
  -    }
  -    if ((fb->flags & (B_WRERR | B_EOUT | B_WR)) != B_WR) {
  -     /* unbuffered writes */
  -     return;
  -    }
   
  -    /* we need at least the header_len + at least 1 data byte
  -     * remember that we've overallocated fb->outbase so that we can always
  -     * fit the two byte CRLF trailer
  -     */
  -    if (fb->bufsiz - fb->outcnt < CHUNK_HEADER_SIZE + 1) {
  -     bflush_core(fb);
  -    }
  -    fb->outchunk = fb->outcnt;
  -    fb->outcnt += CHUNK_HEADER_SIZE;
  -}
  -
  -
   /*
  - * end a chunk -- tweak the chunk_header from start_chunk, and add a trailer
  - */
  -static void end_chunk(BUFF *fb)
  -{
  -    int i;
  -    unsigned char *strp;
  -
  -    if (fb->outchunk == -1) {
  -     /* not chunking */
  -     return;
  -    }
  -
  -    if (fb->outchunk + CHUNK_HEADER_SIZE == fb->outcnt) {
  -     /* nothing was written into this chunk, and we can't write a 0 size
  -      * chunk because that signifies EOF, so just erase it
  -      */
  -     fb->outcnt = fb->outchunk;
  -     fb->outchunk = -1;
  -     return;
  -    }
  -
  -    /* we know this will fit because of how we wrote it in start_chunk() */
  -    i = ap_snprintf((char *) &fb->outbase[fb->outchunk], CHUNK_HEADER_SIZE,
  -             "%x", fb->outcnt - fb->outchunk - CHUNK_HEADER_SIZE);
  -
  -    /* we may have to tack some trailing spaces onto the number we just wrote
  -     * in case it was smaller than our estimated size.  We've also written
  -     * a \0 into the buffer with ap_snprintf so we might have to put a
  -     * \r back in.
  -     */
  -    strp = &fb->outbase[fb->outchunk + i];
  -    while (i < CHUNK_HEADER_SIZE - 2) {
  -     *strp++ = ' ';
  -     ++i;
  -    }
  -    *strp++ = '\015';
  -    *strp = '\012';
  -#ifdef CHARSET_EBCDIC
  -    /* Chunks are an HTTP/1.1 Protocol feature. They must ALWAYS be in ASCII 
*/
  -    ebcdic2ascii(&fb->outbase[fb->outchunk], &fb->outbase[fb->outchunk], 
CHUNK_HEADER_SIZE);
  -#endif /*CHARSET_EBCDIC*/
  -
  -    /* tack on the trailing CRLF, we've reserved room for this */
  -    fb->outbase[fb->outcnt++] = '\015';
  -    fb->outbase[fb->outcnt++] = '\012';
  -
  -    fb->outchunk = -1;
  -}
  -
  -
  -/*
    * Set a flag on (1) or off (0).
    */
   API_EXPORT(int) ap_bsetflag(BUFF *fb, int flag, int value)
   {
       if (value) {
        fb->flags |= flag;
  -     if (flag & B_CHUNK) {
  -         start_chunk(fb);
  -     }
       }
       else {
        fb->flags &= ~flag;
  -     if (flag & B_CHUNK) {
  -         end_chunk(fb);
  -     }
       }
       return value;
   }
  @@ -432,7 +322,7 @@
   #elif defined(O_NDELAY)
       fd_flags &= ~O_NDELAY;
       return fcntl(fd, F_SETFL, fd_flags);
  -#eli f defined(FNDELAY)
  +#elif defined(FNDELAY)
       fd_flags &= ~O_FNDELAY;
       return fcntl(fd, F_SETFL, fd_flags);
   #else
  @@ -454,14 +344,7 @@
    */
   
   
  -#if !defined (B_SFIO)
   #define saferead saferead_guts
  -#else
  -static int saferead(BUFF *fb, char *buf, int nbyte)
  -{
  -    return sfread(fb->sf_in, buf, nbyte);
  -}
  -#endif
   
   
   /* Test the descriptor and flush the output buffer if it looks like
  @@ -510,47 +393,10 @@
       return (rv);
   }
   
  -#ifdef B_SFIO
  -int bsfio_read(Sfio_t * f, char *buf, int nbyte, apache_sfio *disc)
  -{
  -    int rv;
  -    BUFF *fb = disc->buff;
  -
  -    rv = saferead_guts(fb, buf, nbyte, 0);
  -
  -    buf[rv] = '\0';
  -    f->next = 0;
  -
  -    return (rv);
  -}
  -
  -int bsfio_write(Sfio_t * f, char *buf, int nbyte, apache_sfio *disc)
  -{
  -    return ap_write(disc->buff, buf, nbyte);
  -}
  -
  -Sfdisc_t *bsfio_new(pool *p, BUFF *b)
  -{
  -    apache_sfio *disc;
  -
  -    if (!(disc = (apache_sfio *) ap_palloc(p, sizeof(apache_sfio))))
  -                 return (Sfdisc_t *) disc;
  -
  -    disc->disc.readf = (Sfread_f) bsfio_read;
  -    disc->disc.writef = (Sfwrite_f) bsfio_write;
  -    disc->disc.seekf = (Sfseek_f) NULL;
  -    disc->disc.exceptf = (Sfexcept_f) NULL;
  -    disc->buff = b;
   
  -    return (Sfdisc_t *) disc;
  -}
  -#endif
  -
  -
   /* A wrapper around saferead which does error checking and EOF checking
    * yeah, it's confusing, this calls saferead, which calls recvwithtimeout...
  - * and then there's the SFIO case.  Note that saferead takes care
  - * of EINTR.
  + * Note that saferead takes care of EINTR.
    */
   static int read_with_errors(BUFF *fb, void *buf, int nbyte)
   {
  @@ -570,9 +416,6 @@
    * Read up to nbyte bytes into buf.
    * If fewer than byte bytes are currently available, then return those.
    * Returns 0 for EOF, -1 for error.
  - * NOTE EBCDIC: The readahead buffer _always_ contains *unconverted* data.
  - * Only when the caller retrieves data from the buffer (calls bread)
  - * is a conversion done, if the conversion flag is set at that time.
    */
   API_EXPORT(int) ap_bread(BUFF *fb, void *buf, int nbyte)
   {
  @@ -588,32 +431,18 @@
         * buffer from before we went unbuffered. */
        if (fb->incnt) {
            i = (fb->incnt > nbyte) ? nbyte : fb->incnt;
  -#ifdef CHARSET_EBCDIC
  -         if (fb->flags & B_ASCII2EBCDIC)
  -             ascii2ebcdic(buf, fb->inptr, i);
  -         else
  -#endif /*CHARSET_EBCDIC*/
            memcpy(buf, fb->inptr, i);
            fb->incnt -= i;
            fb->inptr += i;
            return i;
        }
        i = read_with_errors(fb, buf, nbyte);
  -#ifdef CHARSET_EBCDIC
  -     if (i > 0 && ap_bgetflag(fb, B_ASCII2EBCDIC))
  -         ascii2ebcdic(buf, buf, i);
  -#endif /*CHARSET_EBCDIC*/
        return i;
       }
   
       nrd = fb->incnt;
   /* can we fill the buffer */
       if (nrd >= nbyte) {
  -#ifdef CHARSET_EBCDIC
  -     if (fb->flags & B_ASCII2EBCDIC)
  -         ascii2ebcdic(buf, fb->inptr, nbyte);
  -     else
  -#endif /*CHARSET_EBCDIC*/
        memcpy(buf, fb->inptr, nbyte);
        fb->incnt = nrd - nbyte;
        fb->inptr += nbyte;
  @@ -621,11 +450,6 @@
       }
   
       if (nrd > 0) {
  -#ifdef CHARSET_EBCDIC
  -     if (fb->flags & B_ASCII2EBCDIC)
  -         ascii2ebcdic(buf, fb->inptr, nrd);
  -     else
  -#endif /*CHARSET_EBCDIC*/
        memcpy(buf, fb->inptr, nrd);
        nbyte -= nrd;
        buf = nrd + (char *) buf;
  @@ -638,10 +462,6 @@
       if (nbyte >= fb->bufsiz) {
   /* read directly into caller's buffer */
        i = read_with_errors(fb, buf, nbyte);
  -#ifdef CHARSET_EBCDIC
  -     if (i > 0 && ap_bgetflag(fb, B_ASCII2EBCDIC))
  -         ascii2ebcdic(buf, buf, i);
  -#endif /*CHARSET_EBCDIC*/
        if (i == -1) {
            return nrd ? nrd : -1;
        }
  @@ -656,11 +476,6 @@
        fb->incnt = i;
        if (i > nbyte)
            i = nbyte;
  -#ifdef CHARSET_EBCDIC
  -     if (fb->flags & B_ASCII2EBCDIC)
  -         ascii2ebcdic(buf, fb->inptr, i);
  -     else
  -#endif /*CHARSET_EBCDIC*/
        memcpy(buf, fb->inptr, i);
        fb->incnt -= i;
        fb->inptr += i;
  @@ -721,7 +536,6 @@
        }
   
        ch = fb->inptr[i++];
  -#ifndef CHARSET_EBCDIC
        if (ch == '\012') {     /* got LF */
            if (ct == 0)
                buff[ct++] = '\n';
  @@ -734,22 +548,6 @@
                i--;            /* no room for LF */
            break;
        }
  -#else /* an EBCDIC machine: do the same, but convert to EBCDIC on the fly: */
  -     if (fb->flags & B_ASCII2EBCDIC)
  -         ch = os_toebcdic[(unsigned char)ch];
  -     if (ch == os_toebcdic['\012']) {  /* got LF */
  -         if (ct == 0)
  -             buff[ct++] = '\n';
  -/* if just preceeded by CR, replace CR with LF */
  -         else if (buff[ct - 1] == os_toebcdic['\015'])
  -             buff[ct - 1] = '\n';
  -         else if (ct < n - 1)
  -             buff[ct++] = '\n';
  -         else
  -             i--;            /* no room for LF */
  -         break;
  -     }
  -#endif
        if (ct == n - 1) {
            i--;                /* push back ch */
            break;
  @@ -796,13 +594,7 @@
        fb->incnt = i;
       }
   
  -#ifndef CHARSET_EBCDIC
       *buff = fb->inptr[0];
  -#else /*CHARSET_EBCDIC*/
  -    *buff = (fb->flags & B_ASCII2EBCDIC)
  -          ? os_toebcdic[(unsigned char)fb->inptr[0]]
  -          : fb->inptr[0];
  -#endif /*CHARSET_EBCDIC*/
       return 1;
   }
   
  @@ -873,42 +665,6 @@
   }
   
   
  -/*
  - * When doing chunked encodings we really have to write everything in the
  - * chunk before proceeding onto anything else.  This routine either writes
  - * nbytes and returns 0 or returns -1 indicating a failure.
  - *
  - * This is *seriously broken* if used on a non-blocking fd.  It will poll.
  - *
  - * Deals with calling doerror and setting bytes_sent.
  - */
  -static int write_it_all(BUFF *fb, const void *buf, int nbyte)
  -{
  -    int i;
  -
  -    if (fb->flags & (B_WRERR | B_EOUT))
  -     return -1;
  -
  -    while (nbyte > 0) {
  -     i = sendwithtimeout(fb->fd, buf, nbyte, fb->timeout);
  -     if (i < 0) {
  -         if (errno != EAGAIN && errno != EINTR) {
  -             doerror(fb, B_WR);
  -             return -1;
  -         }
  -     }
  -     else {
  -         nbyte -= i;
  -         buf = i + (const char *) buf;
  -         fb->bytes_sent += i;
  -     }
  -     if (fb->flags & B_EOUT)
  -         return -1;
  -    }
  -    return 0;
  -}
  -
  -
   #ifndef NO_WRITEV
   /* Similar to previous, but uses writev.  Note that it modifies vec.
    * return 0 if successful, -1 otherwise.
  @@ -980,63 +736,7 @@
   }
   
   
  -/*
  - * A hook to write() that deals with chunking. This is really a protocol-
  - * level issue, but we deal with it here because it's simpler; this is
  - * an interim solution pending a complete rewrite of all this stuff in
  - * 2.0, using something like sfio stacked disciplines or BSD's funopen().
  - *
  - * Can be used on non-blocking descriptors, but only if they're not chunked.
  - * Deals with doerror() and bytes_sent.
  - */
  -static int bcwrite(BUFF *fb, const void *buf, int nbyte)
  -{
  -    char chunksize[16];              /* Big enough for practically anything 
*/
   #ifndef NO_WRITEV
  -    struct iovec vec[3];
  -#endif
  -
  -    if (fb->flags & (B_WRERR | B_EOUT))
  -     return -1;
  -
  -    if (!(fb->flags & B_CHUNK)) {
  -     return write_with_errors(fb, buf, nbyte);
  -    }
  -
  -#ifdef NO_WRITEV
  -    /* without writev() this has poor performance, too bad */
  -
  -    ap_snprintf(chunksize, sizeof(chunksize), "%x\015\012", nbyte);
  -#ifdef CHARSET_EBCDIC
  -    /* Chunks are an HTTP/1.1 Protocol feature. They must ALWAYS be in ASCII 
*/
  -    ebcdic2ascii(chunksize, chunksize, strlen(chunksize));
  -#endif /*CHARSET_EBCDIC*/
  -    if (write_it_all(fb, chunksize, strlen(chunksize), 0) == -1)
  -     return -1;
  -    if (write_it_all(fb, buf, nbyte, 0) == -1)
  -     return -1;
  -    if (write_it_all(fb, "\015\012", 2, 0) == -1)
  -     return -1;
  -    return nbyte;
  -#else
  -    vec[0].iov_base = chunksize;
  -    vec[0].iov_len = ap_snprintf(chunksize, sizeof(chunksize), "%x\015\012",
  -                              nbyte);
  -#ifdef CHARSET_EBCDIC
  -    /* Chunks are an HTTP/1.1 Protocol feature. They must ALWAYS be in ASCII 
*/
  -    ebcdic2ascii(chunksize, chunksize, strlen(chunksize));
  -#endif /*CHARSET_EBCDIC*/
  -    vec[1].iov_base = (void *) buf;  /* cast is to avoid const warning */
  -    vec[1].iov_len = nbyte;
  -    vec[2].iov_base = "\015\012";
  -    vec[2].iov_len = 2;
  -
  -    return writev_it_all(fb, vec, (sizeof(vec) / sizeof(vec[0]))) ? -1 : 
nbyte;
  -#endif
  -}
  -
  -
  -#ifndef NO_WRITEV
   /*
    * Used to combine the contents of the fb buffer, and a large buffer
    * passed in.
  @@ -1045,47 +745,21 @@
   {
       struct iovec vec[4];
       int nvec;
  -    char chunksize[16];
   
  -    /* it's easiest to end the current chunk */
  -    if (fb->flags & B_CHUNK) {
  -     end_chunk(fb);
  -    }
       nvec = 0;
       if (fb->outcnt > 0) {
        vec[nvec].iov_base = (void *) fb->outbase;
        vec[nvec].iov_len = fb->outcnt;
        ++nvec;
  -    }
  -    if (fb->flags & B_CHUNK) {
  -     vec[nvec].iov_base = chunksize;
  -     vec[nvec].iov_len = ap_snprintf(chunksize, sizeof(chunksize),
  -                                     "%x\015\012", nbyte);
  -#ifdef CHARSET_EBCDIC
  -    /* Chunks are an HTTP/1.1 Protocol feature. They must ALWAYS be in ASCII 
*/
  -     ebcdic2ascii(chunksize, chunksize, strlen(chunksize));
  -#endif /*CHARSET_EBCDIC*/
  -     ++nvec;
  -     vec[nvec].iov_base = (void *) buf;
  -     vec[nvec].iov_len = nbyte;
  -     ++nvec;
  -     vec[nvec].iov_base = "\015\012";
  -     vec[nvec].iov_len = 2;
  -     ++nvec;
  -    }
  -    else {
  -     vec[nvec].iov_base = (void *) buf;
  -     vec[nvec].iov_len = nbyte;
  -     ++nvec;
       }
  +    vec[nvec].iov_base = (void *) buf;
  +    vec[nvec].iov_len = nbyte;
  +    ++nvec;
   
       fb->outcnt = 0;
       if (writev_it_all(fb, vec, nvec)) {
        return -1;
       }
  -    else if (fb->flags & B_CHUNK) {
  -     start_chunk(fb);
  -    }
       return nbyte;
   }
   #endif
  @@ -1100,37 +774,15 @@
    */
   API_EXPORT(int) ap_bwrite(BUFF *fb, const void *buf, int nbyte)
   {
  -    int i, nwr, useable_bufsiz;
  -#ifdef CHARSET_EBCDIC
  -    static char *cbuf = NULL;
  -    static int csize = 0;
  -#endif /*CHARSET_EBCDIC*/
  +    int i, nwr;
   
       if (fb->flags & (B_WRERR | B_EOUT))
        return -1;
       if (nbyte == 0)
        return 0;
   
  -#ifdef CHARSET_EBCDIC
  -    if (ap_bgetflag(fb, B_EBCDIC2ASCII)) {
  -        if (nbyte > csize) {
  -            if (cbuf != NULL)
  -                free(cbuf);
  -            cbuf = malloc(csize = nbyte+HUGE_STRING_LEN);
  -            if (cbuf == NULL) {
  -                fprintf(stderr, "Ouch!  Out of memory in ap_bwrite()!\n");
  -                csize = 0;
  -            }
  -        }
  -        ebcdic2ascii((cbuf) ? cbuf : (void*)buf, buf, nbyte);
  -        buf = (cbuf) ? cbuf : buf;
  -    }
  -#endif /*CHARSET_EBCDIC*/
  -
       if (!(fb->flags & B_WR)) {
  -/* unbuffered write -- have to use bcwrite since we aren't taking care
  - * of chunking any other way */
  -     return bcwrite(fb, buf, nbyte);
  +     return write_with_errors(fb, buf, nbyte);
       }
   
   #ifndef NO_WRITEV
  @@ -1168,18 +820,6 @@
        }
   
   /* the buffer must be full */
  -     if (fb->flags & B_CHUNK) {
  -         end_chunk(fb);
  -         /* it is just too painful to try to re-cram the buffer while
  -          * chunking
  -          */
  -         if (write_it_all(fb, fb->outbase, fb->outcnt) == -1) {
  -             /* we cannot continue after a chunked error */
  -             return -1;
  -         }
  -         fb->outcnt = 0;
  -         break;
  -     }
        i = write_with_errors(fb, fb->outbase, fb->outcnt);
        if (i <= 0) {
            return nwr ? nwr : -1;
  @@ -1200,21 +840,10 @@
            return -1;
       }
   /* we have emptied the file buffer. Now try to write the data from the
  - * original buffer until there is less than bufsiz left.  Note that we
  - * use bcwrite() to do this for us, it will do the chunking so that
  - * we don't have to dink around building a chunk in our own buffer.
  - *
  - * Note also that bcwrite never does a partial write if we're chunking,
  - * so we're guaranteed to either end in an error state, or make it
  - * out of this loop and call start_chunk() below.
  - *
  - * Remember we may not be able to use the entire buffer if we're
  - * chunking.
  + * original buffer until there is less than bufsiz left.
    */
  -    useable_bufsiz = fb->bufsiz;
  -    if (fb->flags & B_CHUNK) useable_bufsiz -= CHUNK_HEADER_SIZE;
  -    while (nbyte >= useable_bufsiz) {
  -     i = bcwrite(fb, buf, nbyte);
  +    while (nbyte >= fb->bufsiz) {
  +     i = write_with_errors(fb, buf, nbyte);
        if (i <= 0) {
            return nwr ? nwr : -1;
        }
  @@ -1228,8 +857,6 @@
       }
   /* copy what's left to the file buffer */
       fb->outcnt = 0;
  -    if (fb->flags & B_CHUNK)
  -     start_chunk(fb);
       if (nbyte > 0)
        memcpy(fb->outbase + fb->outcnt, buf, nbyte);
       fb->outcnt += nbyte;
  @@ -1280,15 +907,8 @@
       if ((fb->flags & (B_WRERR | B_EOUT | B_WR)) != B_WR)
        return -1;
   
  -    if (fb->flags & B_CHUNK)
  -     end_chunk(fb);
  -
       ret = bflush_core(fb);
   
  -    if (ret == 0 && (fb->flags & B_CHUNK)) {
  -     start_chunk(fb);
  -    }
  -
       return ret;
   }
   
  @@ -1315,11 +935,6 @@
       fb->flags |= B_EOF | B_EOUT;
       fb->fd = -1;
   
  -#ifdef B_SFIO
  -    sfclose(fb->sf_in);
  -    sfclose(fb->sf_out);
  -#endif
  -
       if (rc1 != 0)
        return rc1;
       return rc2;
  @@ -1383,13 +998,6 @@
       struct bprintf_data *b = (struct bprintf_data *)vbuff;
       BUFF *fb = b->fb;
   
  -#ifdef CHARSET_EBCDIC
  -    /* Characters were pushed into the buffer without conversion. Do it now 
*/
  -    if (fb->flags & B_EBCDIC2ASCII)
  -        ebcdic2ascii(&fb->outbase[fb->outcnt],
  -                  &fb->outbase[fb->outcnt],
  -                  b->vbuff.curpos - (char *)&fb->outbase[fb->outcnt]);
  -#endif /*CHARSET_EBCDIC*/
       fb->outcnt += b->vbuff.curpos - (char *)&fb->outbase[fb->outcnt];
       if (fb->outcnt == fb->bufsiz) {
        if (ap_bflush(fb)) {
  @@ -1417,13 +1025,6 @@
       res = ap_vformatter(bprintf_flush, &b.vbuff, fmt, ap);
       va_end(ap);
       if (res != -1) {
  -#ifdef CHARSET_EBCDIC
  -     /* Characters were pushed into the buffer without conversion. Do it now 
*/
  -     if (fb->flags & B_EBCDIC2ASCII)
  -         ebcdic2ascii(&fb->outbase[fb->outcnt],
  -                      &fb->outbase[fb->outcnt],
  -                      b.vbuff.curpos - (char *)&fb->outbase[fb->outcnt]);
  -#endif /*CHARSET_EBCDIC*/
        fb->outcnt += b.vbuff.curpos - (char *)&fb->outbase[fb->outcnt];
       }
       return res;
  @@ -1442,13 +1043,6 @@
       b.fb = fb;
       res = ap_vformatter(bprintf_flush, &b.vbuff, fmt, ap);
       if (res != -1) {
  -#ifdef CHARSET_EBCDIC
  -     /* Characters were pushed into the buffer without conversion. Do it now 
*/
  -     if (fb->flags & B_EBCDIC2ASCII)
  -         ebcdic2ascii(&fb->outbase[fb->outcnt],
  -                      &fb->outbase[fb->outcnt],
  -                      b.vbuff.curpos - (char *)&fb->outbase[fb->outcnt]);
  -#endif /*CHARSET_EBCDIC*/
        fb->outcnt += b.vbuff.curpos - (char *)&fb->outbase[fb->outcnt];
       }
       return res;
  
  
  
  1.2       +4 -0      apache-2.0/mpm/src/main/http_protocol.c
  
  Index: http_protocol.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/mpm/src/main/http_protocol.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- http_protocol.c   1999/06/18 18:39:30     1.1
  +++ http_protocol.c   1999/06/18 19:20:49     1.2
  @@ -1551,8 +1551,10 @@
       r->sent_bodyct = 1;         /* Whatever follows is real body stuff... */
   
       /* Set buffer flags for the body */
  +#if 0        /* TODO: implemented chunked layer */
       if (r->chunked)
           ap_bsetflag(r->connection->client, B_CHUNK, 1);
  +#endif
   #ifdef CHARSET_EBCDIC
       if (!convert)
           ap_bsetflag(r->connection->client, B_EBCDIC2ASCII, convert);
  @@ -1571,7 +1573,9 @@
            * Turn off chunked encoding --- we can only do this once.
            */
           r->chunked = 0;
  +#if 0        /* TODO: implemented chunked layer */
           ap_bsetflag(r->connection->client, B_CHUNK, 0);
  +#endif
   
           ap_rputs("0\015\012", r);
           /* If we had footer "headers", we'd send them now */
  
  
  

Reply via email to