--- links-2.1pre31/configure.in.gzip 2007-12-09 16:36:20.000000000 +0800 +++ links-2.1pre31/configure.in 2007-12-09 16:36:47.000000000 +0800 @@ -231,6 +231,10 @@ AC_CHECK_FUNC(herror, AC_DEFINE(HAVE_HERROR)) AC_CHECK_FUNC(cfmakeraw, AC_DEFINE(HAVE_CFMAKERAW)) +# GZIP patch +AC_CHECK_LIB(z,gzread) +### + AC_HAVE_FUNCS(cygwin_conv_to_full_win32_path) AC_MSG_CHECKING([for requested debug level]) --- links-2.1pre31/file.c.gzip 2007-12-09 16:36:57.000000000 +0800 +++ links-2.1pre31/file.c 2007-12-09 16:37:13.000000000 +0800 @@ -365,22 +365,85 @@ add_to_str(&file, &fl, "</pre></body></html>\n"); head = stracpy("\r\nContent-Type: text/html\r\n"); } else { - mem_free(name); - /* + !stt.st_size is there because of bug in Linux. Read returns - -EACCES when reading 0 bytes to invalid address */ - if (stt.st_size > MAXINT) { + +/* GZIP patch */ +#ifdef HAVE_LIBZ + if (!casecmp(name + (strlen(name) - 3), ".gz", 3)) { + unsigned char *tmp; + int pos, len, tlen; + gzFile filegz; + + filegz = gzdopen (h, "rb"); + + if (!filegz) { + mem_free(name); + close(h); + setcstate(c, S_CANT_READ); + abort_connection(c); + return; + } + + mem_free(name); + file = mem_alloc(BUFSIZ); + + if (!file) { + close(h); + setcstate(c, S_OUT_OF_MEM); + abort_connection(c); + return; + } + + pos = 0; + tlen = 0; + while (1) { + len = gzread(filegz, file + pos, BUFSIZ); + + if (len < 0) { + close(h); + setcstate(c, S_CANT_READ); + abort_connection(c); + mem_free(file); + return; + } + + if (!len) break; + + tlen += len; + pos += BUFSIZ; + tmp = mem_realloc(file, pos + BUFSIZ); + + if (!tmp) { + close(h); + setcstate(c, S_OUT_OF_MEM); + abort_connection(c); + mem_free(file); + return; + } + + file = tmp; + } close(h); - setcstate(c, S_LARGE_FILE); abort_connection(c); - return; - } - file = mem_alloc(stt.st_size + !stt.st_size); - if ((r = read(h, file, stt.st_size)) != stt.st_size) { - mem_free(file); close(h); - setcstate(c, r == -1 ? -errno : S_FILE_ERROR); - abort_connection(c); return; + fl = tlen; + } else { +#endif /* end GZIP PATCH */ + + mem_free(name); + /* + !stt.st_size is there because of bug in Linux. Read returns + -EACCES when reading 0 bytes to invalid address */ + if (stt.st_size > MAXINT) { + close(h); + setcstate(c, S_OUT_OF_MEM); abort_connection(c); + return; + } + file = mem_alloc(stt.st_size + !stt.st_size); + if ((r = read(h, file, stt.st_size)) != stt.st_size) { + mem_free(file); close(h); + setcstate(c, r == -1 ? -errno : S_FILE_ERROR); + abort_connection(c); return; + } + close(h); + fl = stt.st_size; } - close(h); - fl = stt.st_size; head = stracpy(""); } if (get_cache_entry(c->url, &e)) { --- links-2.1pre31/links.h.gzip 2007-12-09 16:34:22.000000000 +0800 +++ links-2.1pre31/links.h 2007-12-09 16:34:42.000000000 +0800 @@ -159,6 +159,10 @@ #endif /* #if defined(G) */ #include <termios.h> +/* GZIP patch */ +#ifdef HAVE_LIBZ +#include <zlib.h> +#endif /* end GZIP patch */ #ifdef HAVE_LONG_LONG #define longlong long long --- links-2.1pre31/types.c.gzip 2007-12-09 16:34:48.000000000 +0800 +++ links-2.1pre31/types.c 2007-12-09 16:36:10.000000000 +0800 @@ -820,6 +820,16 @@ ext = NULL; } if (ext) while (ext[extl] && ext[extl] != '.' && !dir_sep(ext[extl]) && !end_of_dir(url, ext[extl])) extl++; + +/* GZIP patch */ +#ifdef HAVE_LIBZ + if (extl == 2 && ! casecmp(ext, "gz", 2)) { + if (!casecmp(url + (strlen(url) - 7), ".htm", 4) || + !casecmp(url + (strlen(url) - 8), ".html", 5)) + return stracpy("text/html"); + } +#endif /* end GZIP patch */ + if ((extl == 3 && !casecmp(ext, "htm", 3)) || (extl == 4 && !casecmp(ext, "html", 4))) return stracpy("text/html"); foreach(e, extensions) {