summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorDrachenfels <drachu@gmail.com>2014-08-21 16:08:53 +0100
committerDrachenfels <drachu@gmail.com>2014-08-21 16:13:57 +0100
commitb86d1e39b9a201c0c6b97c29217ef112c850a6aa (patch)
treef42397415905d53b0b6ccecfcd6640e6abc4f4bc /core
parent89fa70706f9166765c3ac3f799225a467800f065 (diff)
Fixed copy process of stream of bytes for HttpClient.
===================================================== Previously if request was not chunked and longer than arbitrary chunk of 4096 bytes, rest was truncated. With this commit, we will copy everything we have in the memmory.
Diffstat (limited to 'core')
-rw-r--r--core/io/http_client.cpp28
1 files changed, 16 insertions, 12 deletions
diff --git a/core/io/http_client.cpp b/core/io/http_client.cpp
index 27e202f47f..60a200af12 100644
--- a/core/io/http_client.cpp
+++ b/core/io/http_client.cpp
@@ -500,20 +500,24 @@ ByteArray HTTPClient::read_response_body_chunk() {
}
} else {
- ByteArray::Write r = tmp_read.write();
- int rec=0;
- err = connection->get_partial_data(r.ptr(),MIN(body_left,tmp_read.size()),rec);
- if (rec>0) {
- ByteArray ret;
- ret.resize(rec);
- ByteArray::Write w = ret.write();
- copymem(w.ptr(),r.ptr(),rec);
- body_left-=rec;
- if (body_left==0) {
- status=STATUS_CONNECTED;
+ ByteArray ret;
+ ret.resize(MAX(body_left,tmp_read.size()));
+ ByteArray::Write w = ret.write();
+ int _offset = 0;
+ while (body_left > 0) {
+ ByteArray::Write r = tmp_read.write();
+ int rec=0;
+ err = connection->get_partial_data(r.ptr(),MIN(body_left,tmp_read.size()),rec);
+ if (rec>0) {
+ copymem(w.ptr()+_offset,r.ptr(),rec);
+ body_left-=rec;
+ _offset += rec;
}
- return ret;
}
+ if (body_left==0) {
+ status=STATUS_CONNECTED;
+ }
+ return ret;
}