|
@@ -1509,6 +1509,26 @@ static int pull(FILE *fp, struct mg_connection *conn, char *buf, int len) {
|
|
|
return conn->ctx->stop_flag ? -1 : nread;
|
|
|
}
|
|
|
|
|
|
+static int pull_all(FILE *fp, struct mg_connection *conn, char *buf, int len) {
|
|
|
+ int n, nread = 0;
|
|
|
+
|
|
|
+ while (len > 0) {
|
|
|
+ n = pull(fp, conn, buf + nread, len);
|
|
|
+ if (n < 0) {
|
|
|
+ nread = n; // Propagate the error
|
|
|
+ break;
|
|
|
+ } else if (n == 0) {
|
|
|
+ break; // No more data to read
|
|
|
+ } else {
|
|
|
+ conn->consumed_content += n;
|
|
|
+ nread += n;
|
|
|
+ len -= n;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return nread;
|
|
|
+}
|
|
|
+
|
|
|
int mg_read(struct mg_connection *conn, void *buf, size_t len) {
|
|
|
int n, buffered_len, nread;
|
|
|
const char *body;
|
|
@@ -1536,20 +1556,8 @@ int mg_read(struct mg_connection *conn, void *buf, size_t len) {
|
|
|
}
|
|
|
|
|
|
// We have returned all buffered data. Read new data from the remote socket.
|
|
|
- while (len > 0) {
|
|
|
- n = pull(NULL, conn, (char *) buf, (int) len);
|
|
|
- if (n < 0) {
|
|
|
- nread = n; // Propagate the error
|
|
|
- break;
|
|
|
- } else if (n == 0) {
|
|
|
- break; // No more data to read
|
|
|
- } else {
|
|
|
- buf = (char *) buf + n;
|
|
|
- conn->consumed_content += n;
|
|
|
- nread += n;
|
|
|
- len -= n;
|
|
|
- }
|
|
|
- }
|
|
|
+ n = pull_all(NULL, conn, (char *) buf, (int) len);
|
|
|
+ nread = n >= 0 ? nread + n : n;
|
|
|
}
|
|
|
return nread;
|
|
|
}
|
|
@@ -3841,8 +3849,8 @@ static void read_websocket(struct mg_connection *conn) {
|
|
|
len = body_len - header_len;
|
|
|
memcpy(data, buf + header_len, len);
|
|
|
// TODO: handle pull error
|
|
|
- pull(NULL, conn, data + len, data_len - len);
|
|
|
- conn->data_len = 0;
|
|
|
+ pull_all(NULL, conn, data + len, data_len - len);
|
|
|
+ conn->data_len = conn->request_len;
|
|
|
} else {
|
|
|
len = data_len + header_len;
|
|
|
memcpy(data, buf + header_len, data_len);
|