diff options
author | rsc <devnull@localhost> | 2007-04-21 19:48:16 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2007-04-21 19:48:16 +0000 |
commit | f599f28c339fdd6018d64e71a7d49d8c515c2cde (patch) | |
tree | cb7563a7243df47fd1dfc3c013acc5187f86e337 /src | |
parent | 6ce75e8dc072178f410db9a6ae7d70a5101e640c (diff) | |
download | plan9port-f599f28c339fdd6018d64e71a7d49d8c515c2cde.tar.gz plan9port-f599f28c339fdd6018d64e71a7d49d8c515c2cde.tar.bz2 plan9port-f599f28c339fdd6018d64e71a7d49d8c515c2cde.zip |
fix various chunked-related bugs
Diffstat (limited to 'src')
-rw-r--r-- | src/libhttpd/hio.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/libhttpd/hio.c b/src/libhttpd/hio.c index b404cf4c..97d13617 100644 --- a/src/libhttpd/hio.c +++ b/src/libhttpd/hio.c @@ -4,6 +4,7 @@ static char hstates[] = "nrewE"; static char hxfers[] = " x"; +static int _hflush(Hio*, int, int); int hinit(Hio *h, int fd, int mode) @@ -326,7 +327,7 @@ hxferenc(Hio *h, int on) { if(h->xferenc && !on && h->pos != h->start) hflush(h); - if(hflush(h) < 0) + if(_hflush(h, 1, 0) < 0) return -1; h->xferenc = !!on; return 0; @@ -375,7 +376,7 @@ hvprint(Hio *h, char *fmt, va_list args) f.flush = fmthflush; f.farg = h; f.nfmt = 0; - fmtlocaleinit(&f, nil, nil, nil); +// fmtlocaleinit(&f, nil, nil, nil); n = fmtvprint(&f, fmt, args); h->pos = f.to; return n; @@ -394,7 +395,7 @@ hprint(Hio *h, char *fmt, ...) } static int -_hflush(Hio *h, int dolength) +_hflush(Hio *h, int force, int dolength) { uchar *s; int w; @@ -406,6 +407,8 @@ _hflush(Hio *h, int dolength) } s = h->start; w = h->pos - s; + if(w == 0 && !force) + return 0; if(h->xferenc){ *--s = '\n'; *--s = '\r'; @@ -432,13 +435,13 @@ _hflush(Hio *h, int dolength) int hflush(Hio *h) { - return _hflush(h, 0); + return _hflush(h, 0, 0); } int hlflush(Hio* h) { - return _hflush(h, 1); + return _hflush(h, 0, 1); } int |