fix: wait for socket transmissions to finish
This commit is contained in:
parent
40daff5c44
commit
9002b5688c
61
proxy.c
61
proxy.c
|
@ -162,8 +162,13 @@ void do_err(void) {
|
||||||
|
|
||||||
int do_fwd_clt(void) {
|
int do_fwd_clt(void) {
|
||||||
int bytes = 0;
|
int bytes = 0;
|
||||||
|
int ret = 0;
|
||||||
do {
|
do {
|
||||||
bytes += send(clt_sock, srv_msg+bytes, srv_msg_len-bytes, 0);
|
ret = send(clt_sock, srv_msg+bytes, srv_msg_len-bytes, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
bytes += ret;
|
||||||
} while (bytes < srv_msg_len);
|
} while (bytes < srv_msg_len);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -176,20 +181,28 @@ int do_prs_srv(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int do_rcv_srv(void) {
|
int do_rcv_srv(void) {
|
||||||
int ret = recv(srv_sock, srv_msg, PROXY_MAX_MSGLEN, 0);
|
int bytes = 0;
|
||||||
if (ret < 0)
|
int ret = 0;
|
||||||
return -1;
|
do {
|
||||||
|
ret = recv(srv_sock, srv_msg+bytes, PROXY_MAX_MSGLEN-bytes, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return -1;
|
||||||
|
if (!ret)
|
||||||
|
break;
|
||||||
|
|
||||||
srv_msg_len = ret;
|
bytes += ret;
|
||||||
|
} while (bytes < sizeof(PROXY_MAX_MSGLEN));
|
||||||
|
|
||||||
|
srv_msg_len = bytes;
|
||||||
|
|
||||||
if (debug) {
|
if (debug) {
|
||||||
fprintf(stdout, "[%d] Received server message: %s\n", statem, clt_msg);
|
fprintf(stdout, "[%d] Received server message: %s\n", statem, srv_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int con_srv(void) {
|
int do_con_srv(void) {
|
||||||
int ret;
|
int ret;
|
||||||
char *host = getheader("Host");
|
char *host = getheader("Host");
|
||||||
if (!host)
|
if (!host)
|
||||||
|
@ -218,16 +231,14 @@ int con_srv(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int do_fwd_srv(void) {
|
int do_fwd_srv(void) {
|
||||||
int ret = 0;
|
|
||||||
if (srv_sock < 0)
|
|
||||||
ret = con_srv();
|
|
||||||
|
|
||||||
if (ret < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
int bytes = 0;
|
int bytes = 0;
|
||||||
|
int ret = 0;
|
||||||
do {
|
do {
|
||||||
bytes += send(srv_sock, clt_msg+bytes, clt_msg_len-bytes, 0);
|
ret = send(srv_sock, clt_msg+bytes, clt_msg_len-bytes, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
bytes += ret;
|
||||||
} while (bytes < clt_msg_len);
|
} while (bytes < clt_msg_len);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -255,12 +266,19 @@ int do_prs_clt(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int do_rcv_clt(void) {
|
int do_rcv_clt(void) {
|
||||||
int ret;
|
int bytes = 0;
|
||||||
ret = recv(clt_sock, clt_msg, PROXY_MAX_MSGLEN, 0);
|
int ret = 0;
|
||||||
if (ret < 0)
|
do {
|
||||||
return -1;
|
ret = recv(clt_sock, clt_msg+bytes, PROXY_MAX_MSGLEN-bytes, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return -1;
|
||||||
|
if (!ret)
|
||||||
|
break;
|
||||||
|
|
||||||
clt_msg_len = ret;
|
bytes += ret;
|
||||||
|
} while (bytes < sizeof(PROXY_MAX_MSGLEN));
|
||||||
|
|
||||||
|
clt_msg_len = bytes;
|
||||||
|
|
||||||
if (debug) {
|
if (debug) {
|
||||||
fprintf(stdout, "[%d] Received client message: %s\n", statem, clt_msg);
|
fprintf(stdout, "[%d] Received client message: %s\n", statem, clt_msg);
|
||||||
|
@ -309,6 +327,9 @@ void dostatem() {
|
||||||
case STATEM_PRS_CLT:
|
case STATEM_PRS_CLT:
|
||||||
ret = do_prs_clt();
|
ret = do_prs_clt();
|
||||||
break;
|
break;
|
||||||
|
case STATEM_CON_SRV:
|
||||||
|
ret = do_con_srv();
|
||||||
|
break;
|
||||||
case STATEM_FWD_SRV:
|
case STATEM_FWD_SRV:
|
||||||
ret = do_fwd_srv();
|
ret = do_fwd_srv();
|
||||||
break;
|
break;
|
||||||
|
|
15
structs.h
15
structs.h
|
@ -15,17 +15,16 @@
|
||||||
"[ ]+([a-zA-Z0-9_.,/-]+)[\n\r]*$"
|
"[ ]+([a-zA-Z0-9_.,/-]+)[\n\r]*$"
|
||||||
#define REGEX_HEADER "^([a-zA-Z0-9_-]*):[ \t]+([^\r\n]*)"
|
#define REGEX_HEADER "^([a-zA-Z0-9_-]*):[ \t]+([^\r\n]*)"
|
||||||
|
|
||||||
#define CLIENT_MESSAGE "GET http://google.com/auth HTTP/1.0\n"\
|
#define CLIENT_MESSAGE "GET http://archive.0xdeadbeer.org/ HTTP/1.0\r\n\r\n"\
|
||||||
"\n"\
|
"Host: archive.0xdeadbeer.org\r\n"\
|
||||||
"Host: google.com\n"\
|
|
||||||
"Authorization: Bearer ffja2439gjawgjgojserg\n"
|
|
||||||
|
|
||||||
#define STATEM_RCV_CLT 0b00000001
|
#define STATEM_RCV_CLT 0b00000001
|
||||||
#define STATEM_PRS_CLT 0b00000010
|
#define STATEM_PRS_CLT 0b00000010
|
||||||
#define STATEM_FWD_SRV 0b00000100
|
#define STATEM_CON_SRV 0b00000100
|
||||||
#define STATEM_RCV_SRV 0b00001000
|
#define STATEM_FWD_SRV 0b00001000
|
||||||
#define STATEM_PRS_SRV 0b00010000
|
#define STATEM_RCV_SRV 0b00010000
|
||||||
#define STATEM_FWD_CLT 0b00100000
|
#define STATEM_PRS_SRV 0b00100000
|
||||||
|
#define STATEM_FWD_CLT 0b01000000
|
||||||
#define STATEM_ERR 0b10000000
|
#define STATEM_ERR 0b10000000
|
||||||
|
|
||||||
struct header {
|
struct header {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user