diff -Naur links-withgz/configure.in links-0.96pre1/configure.in
--- links-withgz/configure.in Mon Apr 9 01:24:46 2001
+++ links-0.96pre1/configure.in Wed Jun 6 19:16:30 2001
@@ -80,6 +80,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_MSG_CHECKING([for OS/2 threads])
CFLAGS_X="$CFLAGS"
CFLAGS="$CFLAGS -Zmt"
diff -Naur links-withgz/file.c links-0.96pre1/file.c
--- links-withgz/file.c Mon Jan 1 00:26:52 2001
+++ links-0.96pre1/file.c Wed Jun 6 19:14:33 2001
@@ -339,20 +339,94 @@
close(h);
setcstate(c, S_FILE_TYPE); abort_connection(c); return;
} else {
- mem_free(name);
- /* + 1 is there because of bug in Linux. Read returns -EACCES when
- reading 0 bytes to invalid address */
- if (!(file = mem_alloc(stt.st_size + 1))) {
+
+/* 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_OUT_OF_MEM); abort_connection(c); return;
- }
- 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);
+
+ /* + 1 is there because of bug in Linux. Read
+ returns -EACCES when reading 0 bytes to invalid
+ address */
+
+ if (!(file = mem_alloc(stt.st_size + 1))) {
+ close(h);
+ setcstate(c, S_OUT_OF_MEM);
+ abort_connection(c);
+ return;
+ }
+
+ 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;
+/* GZIP patch */
+#ifdef LIBZ
}
- close(h);
- fl = stt.st_size;
+#endif /* end GZIP patch */
+
head = stracpy("");
}
if (get_cache_entry(c->url, &e)) {
diff -Naur links-withgz/links.h links-0.96pre1/links.h
--- links-withgz/links.h Sat Jun 2 02:25:12 2001
+++ links-0.96pre1/links.h Wed Jun 6 19:15:02 2001
@@ -79,6 +79,11 @@
#include <openssl/ssl.h>
#endif
+/* GZIP patch */
+#ifdef HAVE_LIBZ
+#include <zlib.h>
+#endif /* end GZIP patch */
+
#include "os_depx.h"
#include "setup.h"
diff -Naur links-withgz/types.c links-0.96pre1/types.c
--- links-withgz/types.c Mon Jan 1 00:26:52 2001
+++ links-0.96pre1/types.c Wed Jun 6 19:15:45 2001
@@ -65,6 +65,16 @@
if (*ct == '.') ext = ct + 1;
else if (dir_sep(*ct)) ext = NULL;
if (ext) while (ext[extl] && !dir_sep(ext[extl]) && !end_of_dir(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) if (is_in_list(e->ext, ext, extl)) return stracpy(e->ct);