Allow proxies to delay chunks
This commit is contained in:
@ -141,6 +141,7 @@ proxy_ctx_t *proxy_get_by_conf(host_config_t *conf) {
|
||||
void proxy_unlock_ctx(proxy_ctx_t *ctx) {
|
||||
int n = (int) ((ctx - proxies) / MAX_PROXY_CNX_PER_HOST);
|
||||
ctx->in_use = 0;
|
||||
ctx->client = NULL;
|
||||
sem_post(&available[n]);
|
||||
}
|
||||
|
||||
@ -567,62 +568,9 @@ int proxy_init(proxy_ctx_t **proxy_ptr, http_req *req, http_res *res, http_statu
|
||||
}
|
||||
|
||||
int proxy_send(proxy_ctx_t *proxy, sock *client, unsigned long len_to_send, int flags) {
|
||||
char buffer[CHUNK_SIZE], *ptr;
|
||||
long ret = 0, snd_len;
|
||||
|
||||
do {
|
||||
snd_len = 0;
|
||||
if (flags & PROXY_CHUNKED) {
|
||||
ret = sock_recv_chunk_header(&proxy->proxy);
|
||||
if (ret < 0) {
|
||||
if (ret == -1) {
|
||||
error("Unable to receive from server: Malformed chunk header");
|
||||
} else {
|
||||
error("Unable to receive from server");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
len_to_send = ret;
|
||||
ret = 1;
|
||||
}
|
||||
while (snd_len < len_to_send) {
|
||||
ret = sock_recv(&proxy->proxy, buffer, CHUNK_SIZE < (len_to_send - snd_len) ? CHUNK_SIZE : len_to_send - snd_len, 0);
|
||||
if (ret <= 0) {
|
||||
error("Unable to receive from server");
|
||||
break;
|
||||
}
|
||||
ptr = buffer;
|
||||
long buf_len = ret;
|
||||
ret = 1;
|
||||
|
||||
if (flags & PROXY_CHUNKED) ret = sock_send_chunk_header(client, buf_len);
|
||||
if (ret <= 0) goto err;
|
||||
|
||||
ret = sock_send_x(client, ptr, buf_len, 0);
|
||||
if (ret <= 0) goto err;
|
||||
snd_len += ret;
|
||||
|
||||
if (flags & PROXY_CHUNKED) ret = sock_send_chunk_trailer(client);
|
||||
if (ret <= 0) {
|
||||
err:
|
||||
error("Unable to send");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ret <= 0) break;
|
||||
if (flags & PROXY_CHUNKED) if ((ret = sock_recv_chunk_trailer(&proxy->proxy)) == -1) break;
|
||||
} while ((flags & PROXY_CHUNKED) && len_to_send > 0);
|
||||
|
||||
if (ret <= 0) return -1;
|
||||
|
||||
if (flags & PROXY_CHUNKED) {
|
||||
if (sock_send_last_chunk(client) == -1) {
|
||||
error("Unable to send");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
char buffer[CHUNK_SIZE];
|
||||
if (sock_splice(client, &proxy->proxy, buffer, sizeof(buffer), len_to_send) == -1)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -252,31 +252,26 @@ long sock_splice_chunked(sock *dst, sock *src, void *buf, unsigned long buf_len,
|
||||
unsigned long send_len = 0, next_len;
|
||||
|
||||
do {
|
||||
ret = sock_recv_chunk_header(src);
|
||||
if (ret < 0) {
|
||||
errno = EPROTO;
|
||||
return -2;
|
||||
}
|
||||
if ((ret = sock_recv_chunk_header(src)) == -1)
|
||||
return -1;
|
||||
|
||||
next_len = ret;
|
||||
|
||||
if (flags & SOCK_CHUNKED) {
|
||||
if (flags & SOCK_CHUNKED)
|
||||
if (sock_send_chunk_header(dst, next_len) == -1)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((ret = sock_splice(dst, src, buf, buf_len, next_len)) < 0)
|
||||
if ((ret = sock_splice(dst, src, buf, buf_len, next_len)) == -1)
|
||||
return ret;
|
||||
|
||||
send_len += ret;
|
||||
|
||||
if (flags & SOCK_CHUNKED) {
|
||||
if (sock_send_chunk_trailer(dst) == -1)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (sock_recv_chunk_trailer(src) == -1)
|
||||
return -1;
|
||||
|
||||
if (flags & SOCK_CHUNKED)
|
||||
if (sock_send_chunk_trailer(dst) == -1)
|
||||
return -1;
|
||||
} while (!(flags & SOCK_SINGLE_CHUNK) && next_len != 0);
|
||||
|
||||
return (long) send_len;
|
||||
@ -364,7 +359,7 @@ int sock_recv_chunk_trailer(sock *s) {
|
||||
if (sock_recv_x(s, buf, sizeof(buf), MSG_PEEK) == -1)
|
||||
return -1;
|
||||
|
||||
if (buf[0] != '\r' || buf[1] == '\n') {
|
||||
if (buf[0] != '\r' || buf[1] != '\n') {
|
||||
errno = EPROTO;
|
||||
return -1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user