[w3m-dev 02592] Accept: and AcceptEncoding:

From: Fumitoshi UKAI <ukai@debian.or.jp>
This commit is contained in:
Fumitoshi UKAI
2001-11-30 09:54:22 +00:00
parent 8bd2f7b4d9
commit c5cd840adb
8 changed files with 331 additions and 170 deletions
+42
View File
@@ -1,3 +1,45 @@
2001-11-30 Fumitoshi UKAI <ukai@debian.or.jp>
* [w3m-dev 02592] Accept: and AcceptEncoding:
* url.c (otherinfo): use acceptableEncoding() acceptableMimeTypes()
* file.c: add compression_decoder
* file.c (check_compress): rewrite by using compression_decoder
* file.c (compress_application_type): ditto
* file.c (uncompressed_file_type): ditto
* file.c (check_command): added
* file.c (acceptableEncoding): added
* proto.h (acceptableEncoding): ditto
* file.c (uncompress_stream): renamed from gunzip_stream
* file.c (uncompress_stream): rewrite by using compression_decoder
* configure: add PATH_SEPARATOR
* mailcap.c (extractMailcapEntry): static
* mailcap.c (loadMailcap): static
* proto.h (loadMailcap): removed
* mailcap.c (acceptableMimeTypes): added
* proto.h (acceptableMimeTypes): added
* configure: #define USE_PATH_ENVVAR for __EMX__
* file.c: GUNZIP_*, BUNZIP2_*, INFLATE_* removed here -> config.h
* file.c (gunzip_stream): s/(GUNZIP|BUNZIP2|INFLATE)_CMD/\1_CMDNAME/
* configure (config.h): GUNZIP_*, BUNZIP2_*, INFLATE_* moved here
* fm.h (DirBufferCommand): use CGI_EXTENSION
* fm.h (mailcap_list): removed from global -> mailcap.c
* fm.h (UserMailcap): removed from global -> mailcap.c
* mailcap.c: static mailcap_list
* mailcap.c: static UserMailcap
* proto.h (initMimeTypes): moved
* proto.h (get_os2_dft): removed
* rc.c (loadMimeTypes): removed here -> url.c
* rc.c (initMimeTypes): removed here -> url.c
* fm.h (mimetypes_list): removed from global -> url.c
* fm.h (UserMimeTypes): removed from global -> url.c
* url.c: static mimetypes_list
* url.c: static UserMimeTypes
* url.c (loadMimeTypes): moved here
* url.c (initMimeTypes): moved here
2001-11-30 Tsutomu Okada <okada@furuno.co.jp>
* [w3m-dev 02590]
Vendored
+13 -1
View File
@@ -1,5 +1,5 @@
#!/bin/sh
# $Id: configure,v 1.27 2001/11/29 11:09:23 ukai Exp $
# $Id: configure,v 1.28 2001/11/30 09:54:22 ukai Exp $
# Configuration.
#
@@ -2067,12 +2067,19 @@ $def_ipv6_ss_family
#endif
#if defined(__EMX__) /* use \$extension? */
#define GUNZIP_CMDNAME "gzip"
#define BUNZIP2_CMDNAME "bzip2"
#define INFLATE_CMDNAME "inflate.exe"
#define W3MBOOKMARK_CMDNAME "w3mbookmark.exe"
#define W3MHELPERPANEL_CMDNAME "w3mhelperpanel.exe"
#define DEV_NULL_PATH "nul"
#define DEV_TTY_PATH "con"
#define CGI_EXTENSION ".cmd"
#define USE_PATH_ENVVAR
#else
#define GUNZIP_CMDNAME "gunzip"
#define BUNZIP2_CMDNAME "bunzip2"
#define INFLATE_CMDNAME "inflate"
#define W3MBOOKMARK_CMDNAME "w3mbookmark"
#define W3MHELPERPANEL_CMDNAME "w3mhelperpanel"
#define DEV_NULL_PATH "/dev/null"
@@ -2080,6 +2087,11 @@ $def_ipv6_ss_family
#define CGI_EXTENSION ".cgi"
#endif
#define PATH_SEPARATOR ':'
#define GUNZIP_NAME "gunzip"
#define BUNZIP2_NAME "bunzip2"
#define INFLATE_NAME "inflate"
#endif /* makefile_parameter */
#endif /* _CONFIGURED_ */
+120 -64
View File
@@ -1,4 +1,4 @@
/* $Id: file.c,v 1.19 2001/11/29 10:48:12 ukai Exp $ */
/* $Id: file.c,v 1.20 2001/11/30 09:54:22 ukai Exp $ */
#include "fm.h"
#include <sys/types.h>
#include "myctype.h"
@@ -23,7 +23,7 @@
#define min(a,b) ((a) > (b) ? (b) : (a))
#endif /* not min */
static void gunzip_stream(URLFile *uf);
static void uncompress_stream(URLFile *uf);
static FILE *lessopen_stream(char *path);
static Buffer *loadcmdout(char *cmd,
Buffer *(*loadproc) (URLFile *, Buffer *),
@@ -143,6 +143,26 @@ char *violations[COO_EMAX] = {
};
#endif
static struct compression_decoder {
int type;
char *ext;
char *mime_type;
int libfile_p;
char *cmd;
char *name;
char *encoding;
} compression_decoders[] = {
{CMP_COMPRESS, ".gz", "application/x-gzip",
0, GUNZIP_CMDNAME, GUNZIP_NAME, "gzip"},
{CMP_COMPRESS, ".Z", "application/x-compress",
0, GUNZIP_CMDNAME, GUNZIP_NAME, "compress"},
{CMP_BZIP2, ".bz2", "application/x-bzip",
0, BUNZIP2_CMDNAME, BUNZIP2_NAME, "bzip, bzip2"},
{CMP_DEFLATE, NULL, "application/x-deflate",
1, INFLATE_CMDNAME, INFLATE_NAME, "deflate"},
{CMP_NOCOMPRESS, NULL, NULL, 0, NULL, NULL, NULL},
};
#define SAVE_BUF_SIZE 1536
static MySignalHandler
@@ -223,41 +243,36 @@ static void
check_compression(char *path, URLFile *uf)
{
int len;
struct compression_decoder *d;
if (path == NULL)
return;
len = strlen(path);
uf->compression = CMP_NOCOMPRESS;
if (len > 2 && strcasecmp(&path[len - 2], ".Z") == 0) {
uf->compression = CMP_COMPRESS;
uf->guess_type = "application/x-compress";
}
else if (len > 3 && strcasecmp(&path[len - 3], ".gz") == 0) {
uf->compression = CMP_GZIP;
uf->guess_type = "application/x-gzip";
}
else if (len > 4 && strcasecmp(&path[len - 4], ".bz2") == 0) {
uf->compression = CMP_BZIP2;
uf->guess_type = "application/x-bzip";
for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
int elen;
if (d->ext == NULL)
continue;
elen = strlen(d->ext);
if (len > elen && strcasecmp(&path[len - elen], d->ext) == 0) {
uf->compression = d->type;
uf->guess_type = d->mime_type;
break;
}
}
}
static char *
compress_application_type(int compression)
{
switch (compression) {
case CMP_COMPRESS:
return "application/x-compress";
case CMP_GZIP:
return "application/x-gzip";
case CMP_BZIP2:
return "application/x-bzip";
case CMP_DEFLATE:
return "application/x-deflate";
default:
return NULL;
struct compression_decoder *d;
for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
if (d->type == compression)
return d->mime_type;
}
return NULL;
}
static char *
@@ -266,21 +281,20 @@ uncompressed_file_type(char *path, char **ext)
int len, slen;
Str fn;
char *t0;
struct compression_decoder *d;
if (path == NULL)
return NULL;
len = strlen(path);
if (len > 2 && strcasecmp(&path[len - 2], ".Z") == 0) {
slen = 2;
for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
if (d->ext == NULL)
continue;
slen = strlen(d->ext);
if (len > slen && strcasecmp(&path[len - slen], d->ext) == 0)
break;
}
else if (len > 3 && strcasecmp(&path[len - 3], ".gz") == 0) {
slen = 3;
}
else if (len > 4 && strcasecmp(&path[len - 4], ".bz2") == 0) {
slen = 4;
}
else
if (d->type == CMP_NOCOMPRESS)
return NULL;
fn = Strnew_charp(path);
@@ -326,12 +340,71 @@ examineFile(char *path, URLFile *uf)
char *t0 = uncompressed_file_type(path, &ext);
uf->guess_type = t0;
uf->ext = ext;
gunzip_stream(uf);
uncompress_stream(uf);
return;
}
}
}
#define S_IXANY (S_IXUSR|S_IXGRP|S_IXOTH)
int
check_command(char *cmd, int libfile_p)
{
static char *path = NULL;
Str dirs;
char *p, *np;
Str pathname;
struct stat st;
if (path == NULL)
path = getenv("PATH");
if (libfile_p)
dirs = Strnew_charp(w3m_lib_dir());
else
dirs = Strnew_charp(path);
for (p = dirs->ptr; p != NULL; p = np) {
np = strchr(p, PATH_SEPARATOR);
if (np)
*np++ = '\0';
pathname = Strnew();
Strcat_charp(pathname, p);
Strcat_char(pathname, '/');
Strcat_charp(pathname, cmd);
if (stat(pathname->ptr, &st) == 0
&& S_ISREG(st.st_mode)
&& (st.st_mode & S_IXANY) != 0)
return 1;
}
return 0;
}
char *
acceptableEncoding()
{
static Str encodings = NULL;
struct compression_decoder *d;
TextList *l;
char *p;
if (encodings != NULL)
return encodings->ptr;
l = newTextList();
for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
if (check_command(d->cmd, d->libfile_p)) {
pushText(l, d->encoding);
}
}
while ((p = popText(l)) != NULL) {
if (encodings == NULL)
encodings = Strnew();
else
Strcat_charp(encodings, ", ");
Strcat_charp(encodings, p);
}
return encodings->ptr;
}
/*
* convert line
*/
@@ -1263,7 +1336,7 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
if (!(w3m_dump & DUMP_SOURCE) &&
(w3m_dump & ~DUMP_FRAME || is_text_type(t)
|| searchExtViewer(t))) {
gunzip_stream(&f);
uncompress_stream(&f);
uncompressed_file_type(pu.file, &f.ext);
}
else {
@@ -5961,46 +6034,29 @@ checkOverWrite(char *path)
return -1;
}
#ifdef __EMX__
#define GUNZIP_CMD "gzip"
#define BUNZIP2_CMD "bzip2"
#define INFLATE_CMD libFile("inflate.exe")
#else /* not __EMX__ */
#define GUNZIP_CMD "gunzip"
#define BUNZIP2_CMD "bunzip2"
#define INFLATE_CMD libFile("inflate")
#endif /* not __EMX__ */
#define GUNZIP_NAME "gunzip"
#define BUNZIP2_NAME "bunzip2"
#define INFLATE_NAME "inflate"
static void
gunzip_stream(URLFile *uf)
uncompress_stream(URLFile *uf)
{
int pid1;
int fd1[2];
char *expand_cmd = GUNZIP_CMD;
char *expand_cmd = GUNZIP_CMDNAME;
char *expand_name = GUNZIP_NAME;
char *tmpf = NULL;
struct compression_decoder *d;
if (IStype(uf->stream) != IST_ENCODED) {
uf->stream = newEncodedStream(uf->stream, uf->encoding);
uf->encoding = ENC_7BIT;
}
switch (uf->compression) {
case CMP_COMPRESS:
case CMP_GZIP:
expand_cmd = GUNZIP_CMD;
expand_name = GUNZIP_NAME;
break;
case CMP_BZIP2:
expand_cmd = BUNZIP2_CMD;
expand_name = BUNZIP2_NAME;
break;
case CMP_DEFLATE:
expand_cmd = INFLATE_CMD;
expand_name = INFLATE_NAME;
break;
for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
if (uf->compression == d->type) {
if (d->libfile_p)
expand_cmd = libFile(d->cmd);
else
expand_cmd = d->cmd;
expand_name = d->name;
break;
}
}
uf->compression = CMP_NOCOMPRESS;
+2 -10
View File
@@ -1,4 +1,4 @@
/* $Id: fm.h,v 1.23 2001/11/29 09:34:14 ukai Exp $ */
/* $Id: fm.h,v 1.24 2001/11/30 09:54:22 ukai Exp $ */
/*
* w3m: WWW wo Miru utility
*
@@ -744,11 +744,7 @@ global char *BookmarkFile init(NULL);
global char *pauth init(NULL);
global Str proxy_auth_cookie init(NULL);
global int UseExternalDirBuffer init(TRUE);
#ifdef __EMX__
global char *DirBufferCommand init("file:///$LIB/dirlist.cmd");
#else
global char *DirBufferCommand init("file:///$LIB/dirlist.cgi");
#endif /* __EMX__ */
global char *DirBufferCommand init("file:///$LIB/dirlist" CGI_EXTENSION);
global int ignore_null_img_alt init(TRUE);
global struct auth_cookie *Auth_cookie init(NULL);
@@ -757,10 +753,6 @@ global char *Local_cookie init(NULL);
global struct cookie *First_cookie init(NULL);
#endif /* USE_COOKIE */
global struct mailcap **UserMailcap;
global struct table2 **UserMimeTypes;
global TextList *mailcap_list;
global TextList *mimetypes_list;
global char *mailcap_files init(USER_MAILCAP ", " SYS_MAILCAP);
global char *mimetypes_files init(USER_MIMETYPES ", " SYS_MIMETYPES);
+69 -19
View File
@@ -1,4 +1,4 @@
/* $Id: mailcap.c,v 1.7 2001/11/29 09:34:15 ukai Exp $ */
/* $Id: mailcap.c,v 1.8 2001/11/30 09:54:22 ukai Exp $ */
#include "fm.h"
#include "myctype.h"
#include <stdio.h>
@@ -12,22 +12,8 @@ static struct mailcap DefaultMailcap[] = {
{NULL, NULL, 0, NULL, NULL, NULL}
};
void
initMailcap()
{
int i;
TextListItem *tl;
if (non_null(mailcap_files))
mailcap_list = make_domain_list(mailcap_files);
else
mailcap_list = NULL;
if (mailcap_list == NULL)
return;
UserMailcap = New_N(struct mailcap *, mailcap_list->nitem);
for (i = 0, tl = mailcap_list->first; tl; i++, tl = tl->next)
UserMailcap[i] = loadMailcap(tl->ptr);
}
static TextList *mailcap_list;
static struct mailcap **UserMailcap;
int
mailcapMatch(struct mailcap *mcap, char *type)
@@ -124,7 +110,7 @@ matchMailcapAttr(char *p, char *attr, int len, Str *value)
return 0;
}
int
static int
extractMailcapEntry(char *mcap_entry, struct mailcap *mcap)
{
int j, k;
@@ -193,7 +179,7 @@ extractMailcapEntry(char *mcap_entry, struct mailcap *mcap)
return 1;
}
struct mailcap *
static struct mailcap *
loadMailcap(char *filename)
{
FILE *f;
@@ -233,6 +219,70 @@ loadMailcap(char *filename)
return mcap;
}
void
initMailcap()
{
TextListItem *tl;
int i;
if (non_null(mailcap_files))
mailcap_list = make_domain_list(mailcap_files);
else
mailcap_list = NULL;
if (mailcap_list == NULL)
return;
UserMailcap = New_N(struct mailcap *, mailcap_list->nitem);
for (i = 0, tl = mailcap_list->first; tl; i++, tl = tl->next)
UserMailcap[i] = loadMailcap(tl->ptr);
}
char *
acceptableMimeTypes()
{
static Str types = NULL;
TextList *l;
Hash_si *mhash;
char *p;
int i;
if (types != NULL)
return types->ptr;
/* generate acceptable media types */
l = newTextList();
mhash = newHash_si(16); /* XXX */
pushText(l, "text");
putHash_si(mhash, "text", 1);
pushText(l, "image");
putHash_si(mhash, "image", 1);
for (i = 0; i < mailcap_list->nitem; i++) {
struct mailcap *mp = UserMailcap[i];
char *mt;
if (mp == NULL)
continue;
for (; mp->type; mp++) {
p = strchr(mp->type, '/');
if (p == NULL)
continue;
mt = allocStr(mp->type, p - mp->type);
if (getHash_si(mhash, mt, 0) == 0) {
pushText(l, mt);
putHash_si(mhash, mt, 1);
}
}
}
while ((p = popText(l)) != NULL) {
if (types == NULL)
types = Strnew();
else
Strcat_charp(types, ", ");
Strcat_charp(types, p);
Strcat_charp(types, "/*");
}
return types->ptr;
}
struct mailcap *
searchExtViewer(char *type)
{
+4 -3
View File
@@ -1,4 +1,4 @@
/* $Id: proto.h,v 1.10 2001/11/29 09:34:15 ukai Exp $ */
/* $Id: proto.h,v 1.11 2001/11/30 09:54:22 ukai Exp $ */
/*
* This file was automatically generated by version 1.7 of cextract.
* Manual editing not recommended.
@@ -108,6 +108,7 @@ extern int currentLn(Buffer *buf);
extern void tmpClearBuffer(Buffer *buf);
extern char *filename_extension(char *patch, int is_url);
extern void examineFile(char *path, URLFile *uf);
extern char *acceptableEncoding();
extern int dir_exist(char *path);
extern Str convertLine(URLFile *uf, Str line, char *code, int mode);
extern Buffer *loadFile(char *path);
@@ -391,6 +392,7 @@ extern char str_to_code(char *str);
extern char *code_to_str(char code);
extern void put_sjis(Str os, unsigned char ub, unsigned char lb);
#endif /* JP_CHARSET */
extern void initMimeTypes();
extern void free_ssl_ctx();
extern ParsedURL *baseURL(Buffer *buf);
extern int openSocket(char *hostname, char *remoteport_name,
@@ -410,9 +412,9 @@ extern TextList *make_domain_list(char *domain_list);
extern int check_no_proxy(char *domain);
extern char *filename_extension(char *path, int is_url);
extern int mailcapMatch(struct mailcap *mcap, char *type);
extern struct mailcap *loadMailcap(char *filename);
extern struct mailcap *searchMailcap(struct mailcap *table, char *type);
extern void initMailcap();
extern char *acceptableMimeTypes();
extern struct mailcap *searchExtViewer(char *type);
extern Str unquote_mailcap(char *qstr, char *type, char *name, char *attr,
int *mc_stat);
@@ -577,7 +579,6 @@ extern char *guess_save_name(Buffer *buf, char *file);
extern void wrapToggle(void);
extern void saveBufferInfo(void);
extern char *get_os2_dft(const char *, char *);
extern void dispVer(void);
+1 -68
View File
@@ -1,4 +1,4 @@
/* $Id: rc.c,v 1.17 2001/11/30 04:52:57 ukai Exp $ */
/* $Id: rc.c,v 1.18 2001/11/30 09:54:22 ukai Exp $ */
/*
* Initialization file etc.
*/
@@ -1072,73 +1072,6 @@ do_mkdir(const char *dir, long mode)
#define do_mkdir(dir,mode) mkdir(dir,mode)
#endif /* not __EMX__ */
struct table2 *
loadMimeTypes(char *filename)
{
FILE *f;
char *d, *type;
int i, n;
Str tmp;
struct table2 *mtypes;
f = fopen(expandName(filename), "r");
if (f == NULL)
return NULL;
n = 0;
while (tmp = Strfgets(f), tmp->length > 0) {
d = tmp->ptr;
if (d[0] != '#') {
d = strtok(d, " \t\n\r");
if (d != NULL) {
d = strtok(NULL, " \t\n\r");
for (i = 0; d != NULL; i++)
d = strtok(NULL, " \t\n\r");
n += i;
}
}
}
fseek(f, 0, 0);
mtypes = New_N(struct table2, n + 1);
i = 0;
while (tmp = Strfgets(f), tmp->length > 0) {
d = tmp->ptr;
if (d[0] == '#')
continue;
type = strtok(d, " \t\n\r");
if (type == NULL)
continue;
while (1) {
d = strtok(NULL, " \t\n\r");
if (d == NULL)
break;
mtypes[i].item1 = Strnew_charp(d)->ptr;
mtypes[i].item2 = Strnew_charp(type)->ptr;
i++;
}
}
mtypes[i].item1 = NULL;
mtypes[i].item2 = NULL;
fclose(f);
return mtypes;
}
void
initMimeTypes()
{
int i;
TextListItem *tl;
if (non_null(mimetypes_files))
mimetypes_list = make_domain_list(mimetypes_files);
else
mimetypes_list = NULL;
if (mimetypes_list == NULL)
return;
UserMimeTypes = New_N(struct table2 *, mimetypes_list->nitem);
for (i = 0, tl = mimetypes_list->first; tl; i++, tl = tl->next)
UserMimeTypes[i] = loadMimeTypes(tl->ptr);
}
void
sync_with_option(void)
{
+80 -5
View File
@@ -1,4 +1,4 @@
/* $Id: url.c,v 1.12 2001/11/29 09:34:15 ukai Exp $ */
/* $Id: url.c,v 1.13 2001/11/30 09:54:22 ukai Exp $ */
#include "fm.h"
#include <sys/types.h>
#include <sys/socket.h>
@@ -134,6 +134,76 @@ sock_log(char *message, ...)
#endif
static TextList *mimetypes_list;
static struct table2 **UserMimeTypes;
static struct table2 *
loadMimeTypes(char *filename)
{
FILE *f;
char *d, *type;
int i, n;
Str tmp;
struct table2 *mtypes;
f = fopen(expandName(filename), "r");
if (f == NULL)
return NULL;
n = 0;
while (tmp = Strfgets(f), tmp->length > 0) {
d = tmp->ptr;
if (d[0] != '#') {
d = strtok(d, " \t\n\r");
if (d != NULL) {
d = strtok(NULL, " \t\n\r");
for (i = 0; d != NULL; i++)
d = strtok(NULL, " \t\n\r");
n += i;
}
}
}
fseek(f, 0, 0);
mtypes = New_N(struct table2, n + 1);
i = 0;
while (tmp = Strfgets(f), tmp->length > 0) {
d = tmp->ptr;
if (d[0] == '#')
continue;
type = strtok(d, " \t\n\r");
if (type == NULL)
continue;
while (1) {
d = strtok(NULL, " \t\n\r");
if (d == NULL)
break;
mtypes[i].item1 = Strnew_charp(d)->ptr;
mtypes[i].item2 = Strnew_charp(type)->ptr;
i++;
}
}
mtypes[i].item1 = NULL;
mtypes[i].item2 = NULL;
fclose(f);
return mtypes;
}
void
initMimeTypes()
{
int i;
TextListItem *tl;
if (non_null(mimetypes_files))
mimetypes_list = make_domain_list(mimetypes_files);
else
mimetypes_list = NULL;
if (mimetypes_list == NULL)
return;
UserMimeTypes = New_N(struct table2 *, mimetypes_list->nitem);
for (i = 0, tl = mimetypes_list->first; tl; i++, tl = tl->next)
UserMimeTypes[i] = loadMimeTypes(tl->ptr);
}
static char *
DefaultFile(int scheme)
{
@@ -1127,10 +1197,15 @@ otherinfo(ParsedURL *target, ParsedURL *current, char *referer)
else
Strcat_charp(s, UserAgent);
Strcat_charp(s, "\r\n");
Strcat_charp(s,
"Accept: text/*, image/*, audio/*, video/*, application/*\r\n");
Strcat_charp(s,
"Accept-Encoding: gzip, compress, bzip, bzip2, deflate\r\n");
Strcat_charp(s, "Accept: ");
Strcat_charp(s, acceptableMimeTypes());
Strcat_charp(s, "\r\n");
Strcat_charp(s, "Accept-Encoding: ");
Strcat_charp(s, acceptableEncoding());
Strcat_charp(s, "\r\n");
Strcat_charp(s, "Accept-Language: ");
if (AcceptLang != NULL && *AcceptLang != '\0') {
Strcat_charp(s, AcceptLang);