diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-06-18 21:26:28 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-06-18 21:26:28 +0200 |
commit | ae311094ad8f95c1ff5d06a8edd865579175922d (patch) | |
tree | d7054a1bed19d471b37a798ef48fd12397d875ae /sys/src/cmd/webfs/buq.c | |
parent | 9428062b551f78a6a0bf0625568604d79d2ba632 (diff) |
mothra/webfs: multipart/form-data and file upload support
Diffstat (limited to 'sys/src/cmd/webfs/buq.c')
-rw-r--r-- | sys/src/cmd/webfs/buq.c | 54 |
1 files changed, 33 insertions, 21 deletions
diff --git a/sys/src/cmd/webfs/buq.c b/sys/src/cmd/webfs/buq.c index cbf5c9672..cf45936bd 100644 --- a/sys/src/cmd/webfs/buq.c +++ b/sys/src/cmd/webfs/buq.c @@ -9,6 +9,32 @@ #include "fns.h" static void +kickwqr(Buq *q, Req *r) +{ + Buf **bb, *b; + int l; + + for(bb = &q->bh; q->nwq > 0; bb = &b->next){ + if((b = *bb) == nil) + break; + if(b->wreq == nil || (b->wreq != r && r != nil)) + continue; + l = b->ep - b->rp; + b = realloc(b, sizeof(*b) + l); + *bb = b; + if(b->next == nil) + q->bt = &b->next; + memmove(b->end, b->rp, l); + b->rp = b->end; + b->ep = b->rp + l; + b->wreq->ofcall.count = b->wreq->ifcall.count; + respond(b->wreq, q->error); + b->wreq = nil; + q->nwq--; + } +} + +static void matchreq(Buq *q) { Req *r; @@ -47,10 +73,13 @@ matchreq(Buq *q) if(r = b->wreq){ r->ofcall.count = r->ifcall.count; respond(r, nil); + q->nwq--; } free(b); } } + if(q->closed && q->nwq > 0) + kickwqr(q, nil); rwakeupall(&q->rz); } @@ -136,8 +165,8 @@ buclose(Buq *q, char *error) if(error) q->error = estrdup9p(error); q->closed = 1; - matchreq(q); } + matchreq(q); qunlock(q); } @@ -188,7 +217,7 @@ bureq(Buq *q, Req *r) return; case Twrite: l = r->ifcall.count; - if((q->size + l) < q->limit){ + if(!q->closed && (q->size + l) < q->limit){ r->ofcall.count = buwrite(q, r->ifcall.data, r->ifcall.count); respond(r, nil); return; @@ -202,6 +231,7 @@ bureq(Buq *q, Req *r) *q->bt = b; q->bt = &b->next; q->size += l; + q->nwq++; break; case Tread: case Topen: @@ -218,9 +248,7 @@ bureq(Buq *q, Req *r) void buflushreq(Buq *q, Req *r) { - Buf **bb, *b; Req **rr; - int l; switch(r->ifcall.type){ default: @@ -228,23 +256,7 @@ buflushreq(Buq *q, Req *r) return; case Twrite: qlock(q); - for(bb = &q->bh; b = *bb; bb = &b->next){ - if(b->wreq != r) - continue; - /* fake successfull write */ - l = b->ep - b->rp; - b = realloc(b, sizeof(*b) + l); - memmove(b->end, b->rp, l); - b->rp = b->end; - b->ep = b->rp + l; - b->wreq = nil; - *bb = b; - if(b->next == nil) - q->bt = &b->next; - r->ofcall.count = r->ifcall.count; - respond(r, nil); - break; - } + kickwqr(q, r); break; case Topen: case Tread: |