Fix FastCGI compression
This commit is contained in:
45
src/client.c
45
src/client.c
@ -418,11 +418,10 @@ int client_request_handler(sock *client, unsigned long client_num, unsigned int
|
|||||||
|
|
||||||
ret = fastcgi_header(&fcgi_conn, &res, err_msg);
|
ret = fastcgi_header(&fcgi_conn, &res, err_msg);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
if (ret < 0) {
|
if (ret < 0) goto abort;
|
||||||
goto abort;
|
|
||||||
}
|
|
||||||
goto respond;
|
goto respond;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *status = http_get_header_field(&res.hdr, "Status");
|
char *status = http_get_header_field(&res.hdr, "Status");
|
||||||
if (status != NULL) {
|
if (status != NULL) {
|
||||||
int status_code = (int) strtoul(status, NULL, 10);
|
int status_code = (int) strtoul(status, NULL, 10);
|
||||||
@ -438,25 +437,30 @@ int client_request_handler(sock *client, unsigned long client_num, unsigned int
|
|||||||
sprintf(err_msg, "The status code was set to an invalid or unknown value.");
|
sprintf(err_msg, "The status code was set to an invalid or unknown value.");
|
||||||
goto respond;
|
goto respond;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (status_code >= 300 && status_code < 600) {
|
const char *content_length_f = http_get_header_field(&res.hdr, "Content-Length");
|
||||||
const char *content_type = http_get_header_field(&res.hdr, "Content-Type");
|
content_length = (content_length_f == NULL) ? -1 : strtol(content_length_f, NULL, 10);
|
||||||
const char *content_length_f = http_get_header_field(&res.hdr, "Content-Length");
|
|
||||||
const char *content_encoding = http_get_header_field(&res.hdr, "Content-Encoding");
|
const char *content_type = http_get_header_field(&res.hdr, "Content-Type");
|
||||||
if (content_encoding == NULL && content_type != NULL && content_length_f != NULL &&
|
const char *content_encoding = http_get_header_field(&res.hdr, "Content-Encoding");
|
||||||
strncmp(content_type, "text/html", 9) == 0)
|
if (content_encoding == NULL &&
|
||||||
{
|
content_type != NULL &&
|
||||||
long content_len = strtol(content_length_f, NULL, 10);
|
strncmp(content_type, "text/html", 9) == 0 &&
|
||||||
if (content_len <= sizeof(msg_content) - 1) {
|
content_length != -1 &&
|
||||||
fastcgi_dump(&fcgi_conn, msg_content, sizeof(msg_content));
|
content_length <= sizeof(msg_content) - 1)
|
||||||
goto respond;
|
{
|
||||||
}
|
fastcgi_dump(&fcgi_conn, msg_content, sizeof(msg_content));
|
||||||
}
|
goto respond;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use_fastcgi = 1;
|
||||||
|
|
||||||
|
if (content_length != -1 && content_length < 1024000) {
|
||||||
|
use_fastcgi |= FASTCGI_COMPRESS_HOLD;
|
||||||
}
|
}
|
||||||
|
|
||||||
content_length = -1;
|
content_length = -1;
|
||||||
use_fastcgi = 1;
|
|
||||||
|
|
||||||
int http_comp = http_get_compression(&req, &res);
|
int http_comp = http_get_compression(&req, &res);
|
||||||
if (http_comp & COMPRESS) {
|
if (http_comp & COMPRESS) {
|
||||||
@ -469,6 +473,7 @@ int client_request_handler(sock *client, unsigned long client_num, unsigned int
|
|||||||
}
|
}
|
||||||
http_add_header_field(&res.hdr, "Vary", "Accept-Encoding");
|
http_add_header_field(&res.hdr, "Vary", "Accept-Encoding");
|
||||||
http_add_header_field(&res.hdr, "Content-Encoding", buf0);
|
http_add_header_field(&res.hdr, "Content-Encoding", buf0);
|
||||||
|
http_remove_header_field(&res.hdr, "Content-Length", HTTP_REMOVE_ALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (http_get_header_field(&res.hdr, "Content-Length") == NULL) {
|
if (http_get_header_field(&res.hdr, "Content-Length") == NULL) {
|
||||||
@ -537,7 +542,7 @@ int client_request_handler(sock *client, unsigned long client_num, unsigned int
|
|||||||
if (http_get_header_field(&res.hdr, "Accept-Ranges") == NULL) {
|
if (http_get_header_field(&res.hdr, "Accept-Ranges") == NULL) {
|
||||||
http_add_header_field(&res.hdr, "Accept-Ranges", "none");
|
http_add_header_field(&res.hdr, "Accept-Ranges", "none");
|
||||||
}
|
}
|
||||||
if (!use_fastcgi && file == NULL && ((res.status->code >= 300 && res.status->code < 600) || err_msg[0] != 0)) {
|
if (!use_fastcgi && file == NULL) {
|
||||||
http_remove_header_field(&res.hdr, "Date", HTTP_REMOVE_ALL);
|
http_remove_header_field(&res.hdr, "Date", HTTP_REMOVE_ALL);
|
||||||
http_remove_header_field(&res.hdr, "Server", HTTP_REMOVE_ALL);
|
http_remove_header_field(&res.hdr, "Server", HTTP_REMOVE_ALL);
|
||||||
http_remove_header_field(&res.hdr, "Cache-Control", HTTP_REMOVE_ALL);
|
http_remove_header_field(&res.hdr, "Cache-Control", HTTP_REMOVE_ALL);
|
||||||
@ -646,7 +651,7 @@ int client_request_handler(sock *client, unsigned long client_num, unsigned int
|
|||||||
char *transfer_encoding = http_get_header_field(&res.hdr, "Transfer-Encoding");
|
char *transfer_encoding = http_get_header_field(&res.hdr, "Transfer-Encoding");
|
||||||
int chunked = transfer_encoding != NULL && strcmp(transfer_encoding, "chunked") == 0;
|
int chunked = transfer_encoding != NULL && strcmp(transfer_encoding, "chunked") == 0;
|
||||||
|
|
||||||
int flags = (chunked ? FASTCGI_CHUNKED : 0) | (use_fastcgi & FASTCGI_COMPRESS);
|
int flags = (chunked ? FASTCGI_CHUNKED : 0) | (use_fastcgi & (FASTCGI_COMPRESS | FASTCGI_COMPRESS_HOLD));
|
||||||
ret = fastcgi_send(&fcgi_conn, client, flags);
|
ret = fastcgi_send(&fcgi_conn, client, flags);
|
||||||
} else if (use_rev_proxy) {
|
} else if (use_rev_proxy) {
|
||||||
char *transfer_encoding = http_get_header_field(&res.hdr, "Transfer-Encoding");
|
char *transfer_encoding = http_get_header_field(&res.hdr, "Transfer-Encoding");
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#define FASTCGI_COMPRESS_GZ 2
|
#define FASTCGI_COMPRESS_GZ 2
|
||||||
#define FASTCGI_COMPRESS_BR 4
|
#define FASTCGI_COMPRESS_BR 4
|
||||||
#define FASTCGI_COMPRESS 6
|
#define FASTCGI_COMPRESS 6
|
||||||
|
#define FASTCGI_COMPRESS_HOLD 8
|
||||||
|
|
||||||
#define FASTCGI_PHP 1
|
#define FASTCGI_PHP 1
|
||||||
#define FASTCGI_NECRONDA 2
|
#define FASTCGI_NECRONDA 2
|
||||||
|
Reference in New Issue
Block a user