Bugfix for POST and PUT method

This commit is contained in:
2020-12-29 11:48:56 +01:00
parent bc4a764bd5
commit 798c41f1c8
5 changed files with 32 additions and 4 deletions

View File

@ -419,6 +419,11 @@ int client_request_handler(sock *client, unsigned long client_num, unsigned int
if (php_fpm.socket != 0) close(php_fpm.socket); if (php_fpm.socket != 0) close(php_fpm.socket);
http_free_req(&req); http_free_req(&req);
http_free_res(&res); http_free_res(&res);
if (client->buf != NULL) {
free(client->buf);
client->buf_off = 0;
client->buf_len = 0;
}
return !client_keep_alive; return !client_keep_alive;
} }

View File

@ -510,6 +510,13 @@ int fastcgi_receive(fastcgi_conn *conn, sock *client, unsigned long len) {
.paddingLength = 0, .paddingLength = 0,
.reserved = 0 .reserved = 0
}; };
if (client->buf != NULL && client->buf_len - client->buf_off > 0) {
ret = (int) (client->buf_len - client->buf_off);
memcpy(buf, client->buf + client->buf_off, ret);
goto send;
}
while (rcv_len < len) { while (rcv_len < len) {
if (client->enc) { if (client->enc) {
ret = SSL_read(client->ssl, buf, sizeof(buf)); ret = SSL_read(client->ssl, buf, sizeof(buf));
@ -524,6 +531,7 @@ int fastcgi_receive(fastcgi_conn *conn, sock *client, unsigned long len) {
return -1; return -1;
} }
} }
send:
rcv_len += ret; rcv_len += ret;
header.contentLengthB1 = (ret >> 8) & 0xFF; header.contentLengthB1 = (ret >> 8) & 0xFF;
header.contentLengthB0 = ret & 0xFF; header.contentLengthB0 = ret & 0xFF;

View File

@ -115,7 +115,7 @@ int http_receive_request(sock *client, http_req *req) {
} }
ptr = buf; ptr = buf;
while (header_len != (ptr - buf)) { while (header_len > (ptr - buf + 2)) {
pos0 = strstr(ptr, "\r\n"); pos0 = strstr(ptr, "\r\n");
if (pos0 == NULL) { if (pos0 == NULL) {
print(ERR_STR "Unable to parse header: Invalid header format" CLR_STR); print(ERR_STR "Unable to parse header: Invalid header format" CLR_STR);
@ -159,12 +159,21 @@ int http_receive_request(sock *client, http_req *req) {
int ret = http_parse_header_field(&req->hdr, ptr, pos0); int ret = http_parse_header_field(&req->hdr, ptr, pos0);
if (ret != 0) return ret; if (ret != 0) return ret;
} }
if (pos0[2] == '\r' && pos0[3] == '\n') {
return 0;
}
ptr = pos0 + 2; ptr = pos0 + 2;
} }
if (pos0[2] == '\r' && pos0[3] == '\n') {
break;
}
} }
client->buf_len = rcv_len - (pos0 - buf + 4);
if (client->buf_len > 0) {
client->buf = malloc(client->buf_len);
client->buf_off = 0;
memcpy(client->buf, pos0 + 4, client->buf_len);
}
return 0;
} }
char *http_get_header_field(const http_hdr *hdr, const char *field_name) { char *http_get_header_field(const http_hdr *hdr, const char *field_name) {

View File

@ -285,6 +285,9 @@ int main(int argc, const char *argv[]) {
openssl_init(); openssl_init();
client.buf = NULL;
client.buf_len = 0;
client.buf_off = 0;
client.ctx = SSL_CTX_new(TLS_server_method()); client.ctx = SSL_CTX_new(TLS_server_method());
SSL_CTX_set_options(client.ctx, SSL_OP_SINGLE_DH_USE); SSL_CTX_set_options(client.ctx, SSL_OP_SINGLE_DH_USE);
SSL_CTX_set_verify(client.ctx, SSL_VERIFY_NONE, NULL); SSL_CTX_set_verify(client.ctx, SSL_VERIFY_NONE, NULL);

View File

@ -75,6 +75,9 @@ typedef struct {
int socket; int socket;
SSL_CTX *ctx; SSL_CTX *ctx;
SSL *ssl; SSL *ssl;
char *buf;
unsigned long buf_len;
unsigned long buf_off;
} sock; } sock;
char *ssl_get_error(SSL *ssl, int ret); char *ssl_get_error(SSL *ssl, int ret);