You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by dg...@hyperreal.org on 1999/06/18 21:20:50 UTC
cvs commit: apache-2.0/mpm/src/main buff.c http_protocol.c
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 */