httpd: optional support for gzip-compressed pages
function old new delta send_file_and_exit 662 761 +99 handle_incoming_and_exit 2756 2830 +74 send_headers 603 654 +51 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 3/0 up/down: 224/0) Total: 224 bytes Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
535ce1df5c
commit
7a2ba329b9
@ -270,6 +270,14 @@ config FEATURE_HTTPD_PROXY
|
|||||||
Then a request to /url/myfile will be forwarded to
|
Then a request to /url/myfile will be forwarded to
|
||||||
http://hostname[:port]/new/path/myfile.
|
http://hostname[:port]/new/path/myfile.
|
||||||
|
|
||||||
|
config FEATURE_HTTPD_GZIP
|
||||||
|
bool "Support for GZIP content encoding"
|
||||||
|
default y
|
||||||
|
depends on HTTPD
|
||||||
|
help
|
||||||
|
Makes httpd send files using GZIP content encoding if the
|
||||||
|
client supports it and a pre-compressed <file>.gz exists.
|
||||||
|
|
||||||
config IFCONFIG
|
config IFCONFIG
|
||||||
bool "ifconfig"
|
bool "ifconfig"
|
||||||
default y
|
default y
|
||||||
|
@ -277,6 +277,10 @@ struct globals {
|
|||||||
#if ENABLE_FEATURE_HTTPD_PROXY
|
#if ENABLE_FEATURE_HTTPD_PROXY
|
||||||
Htaccess_Proxy *proxy;
|
Htaccess_Proxy *proxy;
|
||||||
#endif
|
#endif
|
||||||
|
#if ENABLE_FEATURE_HTTPD_GZIP
|
||||||
|
/* client can handle gzip / we are going to send gzip */
|
||||||
|
smallint content_gzip;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
#define G (*ptr_to_globals)
|
#define G (*ptr_to_globals)
|
||||||
#define verbose (G.verbose )
|
#define verbose (G.verbose )
|
||||||
@ -319,6 +323,11 @@ enum {
|
|||||||
#define hdr_cnt (G.hdr_cnt )
|
#define hdr_cnt (G.hdr_cnt )
|
||||||
#define http_error_page (G.http_error_page )
|
#define http_error_page (G.http_error_page )
|
||||||
#define proxy (G.proxy )
|
#define proxy (G.proxy )
|
||||||
|
#if ENABLE_FEATURE_HTTPD_GZIP
|
||||||
|
# define content_gzip (G.content_gzip )
|
||||||
|
#else
|
||||||
|
# define content_gzip 0
|
||||||
|
#endif
|
||||||
#define INIT_G() do { \
|
#define INIT_G() do { \
|
||||||
SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
|
SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
|
||||||
IF_FEATURE_HTTPD_BASIC_AUTH(g_realm = "Web Server Authentication";) \
|
IF_FEATURE_HTTPD_BASIC_AUTH(g_realm = "Web Server Authentication";) \
|
||||||
@ -1027,10 +1036,14 @@ static void send_headers(int responseNum)
|
|||||||
#endif
|
#endif
|
||||||
"Last-Modified: %s\r\n%s %"OFF_FMT"u\r\n",
|
"Last-Modified: %s\r\n%s %"OFF_FMT"u\r\n",
|
||||||
tmp_str,
|
tmp_str,
|
||||||
"Content-length:",
|
content_gzip ? "Transfer-length:" : "Content-length:",
|
||||||
file_size
|
file_size
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (content_gzip)
|
||||||
|
len += sprintf(iobuf + len, "Content-Encoding: gzip\r\n");
|
||||||
|
|
||||||
iobuf[len++] = '\r';
|
iobuf[len++] = '\r';
|
||||||
iobuf[len++] = '\n';
|
iobuf[len++] = '\n';
|
||||||
if (infoString) {
|
if (infoString) {
|
||||||
@ -1500,7 +1513,22 @@ static NOINLINE void send_file_and_exit(const char *url, int what)
|
|||||||
int fd;
|
int fd;
|
||||||
ssize_t count;
|
ssize_t count;
|
||||||
|
|
||||||
fd = open(url, O_RDONLY);
|
if (content_gzip) {
|
||||||
|
/* does <url>.gz exist? Then use it instead */
|
||||||
|
char *gzurl = xasprintf("%s.gz", url);
|
||||||
|
fd = open(gzurl, O_RDONLY);
|
||||||
|
free(gzurl);
|
||||||
|
if (fd != -1) {
|
||||||
|
struct stat sb;
|
||||||
|
fstat(fd, &sb);
|
||||||
|
file_size = sb.st_size;
|
||||||
|
} else {
|
||||||
|
IF_FEATURE_HTTPD_GZIP(content_gzip = 0;)
|
||||||
|
fd = open(url, O_RDONLY);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fd = open(url, O_RDONLY);
|
||||||
|
}
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
bb_perror_msg("can't open '%s'", url);
|
bb_perror_msg("can't open '%s'", url);
|
||||||
@ -1583,8 +1611,11 @@ static NOINLINE void send_file_and_exit(const char *url, int what)
|
|||||||
url, found_mime_type);
|
url, found_mime_type);
|
||||||
|
|
||||||
#if ENABLE_FEATURE_HTTPD_RANGES
|
#if ENABLE_FEATURE_HTTPD_RANGES
|
||||||
if (what == SEND_BODY)
|
if (what == SEND_BODY /* err pages and ranges don't mix */
|
||||||
range_start = 0; /* err pages and ranges don't mix */
|
|| content_gzip /* we are sending compressed page: can't do ranges */ ///why?
|
||||||
|
) {
|
||||||
|
range_start = 0;
|
||||||
|
}
|
||||||
range_len = MAXINT(off_t);
|
range_len = MAXINT(off_t);
|
||||||
if (range_start) {
|
if (range_start) {
|
||||||
if (!range_end) {
|
if (!range_end) {
|
||||||
@ -2047,6 +2078,23 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if ENABLE_FEATURE_HTTPD_GZIP
|
||||||
|
if (STRNCASECMP(iobuf, "Accept-Encoding:") == 0) {
|
||||||
|
char *s = iobuf + sizeof("Accept-Encoding:")-1;
|
||||||
|
while (*s) {
|
||||||
|
///is "Accept-Encoding: compress,gzip" valid?
|
||||||
|
// (that is, no space after ',') -
|
||||||
|
// this code won't handle that
|
||||||
|
s = skip_whitespace(s);
|
||||||
|
if (STRNCASECMP(s, "gzip") == 0)
|
||||||
|
content_gzip = 1;
|
||||||
|
/* Note: we do not support "gzip;q=0"
|
||||||
|
* method of _disabling_ gzip
|
||||||
|
* delivery */
|
||||||
|
s = skip_non_whitespace(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
} /* while extra header reading */
|
} /* while extra header reading */
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user