summaryrefslogtreecommitdiff
path: root/sys/src/cmd/ip
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-07-23 03:24:39 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-07-23 03:24:39 +0200
commitab4b7c2573b35062f211c2548ff20031f998cc8e (patch)
tree015e6f435c34af43b80a7c8e3a8224465fdfd063 /sys/src/cmd/ip
parent497daed116714a8c3f91162fe02ca81ad33bb6fa (diff)
ip/httpfile: fix flushes, fix concurrent reads, set error string
Tflush handling was wrong, we cannot respond to the old request if we have not actually removed the req from the in progress block queue. when reads are issued concurrently, we have to set b->len before the block is inserted into the inprogress list. otherwise findblock() is unable to find it and no requests can be queued on the block. this caused the same offset to be downloaded multiple times. set the errstr in getrange() so in case of an error, we dont get some random previous error string.
Diffstat (limited to 'sys/src/cmd/ip')
-rw-r--r--sys/src/cmd/ip/httpfile.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/sys/src/cmd/ip/httpfile.c b/sys/src/cmd/ip/httpfile.c
index 995a1cfaa..192018c75 100644
--- a/sys/src/cmd/ip/httpfile.c
+++ b/sys/src/cmd/ip/httpfile.c
@@ -100,6 +100,8 @@ delreq(Block *b, Req *r)
*l = r->aux;
if(*l == nil)
b->erq = l;
+ r->aux = nil;
+ respond(r, "interrupted");
return;
}
}
@@ -205,10 +207,6 @@ getrange(Block *b)
int fd, cfd;
uchar *data;
- b->len = Blocksize;
- if(b->off + b->len > size)
- b->len = size - b->off;
-
if(debug)
print("getrange: %lld %lld\n", b->off, b->len);
@@ -230,6 +228,8 @@ getrange(Block *b)
close(fd);
return nil;
}
+
+ werrstr("bad contentrange header");
if(readstring(cfd, buf, sizeof(buf)) <= 0){
Badrange:
close(cfd);
@@ -244,6 +244,7 @@ Badrange:
/* read body data */
data = emalloc9p(b->len);
+ werrstr("body data truncated");
if(readfile(fd, (char*)data, b->len) != b->len){
close(fd);
free(data);
@@ -410,6 +411,9 @@ fileread(Req *r)
if((b = findblock(&inprogress, r->ifcall.offset)) == nil){
b = emalloc9p(sizeof(Block));
b->off = r->ifcall.offset - (r->ifcall.offset % Blocksize);
+ b->len = Blocksize;
+ if(b->off + b->len > size)
+ b->len = size - b->off;
addblock(&inprogress, b);
if(inprogress.first == b)
sendp(httpchan, b);
@@ -467,10 +471,11 @@ fsnetproc(void*)
switch(r->ifcall.type){
case Tflush:
o = r->oldreq;
- b = findblock(&inprogress, o->ifcall.offset);
- if(b != nil)
- delreq(b, o);
- respond(o, "interrupted");
+ if(o->ifcall.type == Tread){
+ b = findblock(&inprogress, o->ifcall.offset);
+ if(b != nil)
+ delreq(b, o);
+ }
respond(r, nil);
break;
case Tread: