[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> 2001-11-30 Tsutomu Okada <okada@furuno.co.jp>
* [w3m-dev 02590] * [w3m-dev 02590]
Vendored
+13 -1
View File
@@ -1,5 +1,5 @@
#!/bin/sh #!/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. # Configuration.
# #
@@ -2067,12 +2067,19 @@ $def_ipv6_ss_family
#endif #endif
#if defined(__EMX__) /* use \$extension? */ #if defined(__EMX__) /* use \$extension? */
#define GUNZIP_CMDNAME "gzip"
#define BUNZIP2_CMDNAME "bzip2"
#define INFLATE_CMDNAME "inflate.exe"
#define W3MBOOKMARK_CMDNAME "w3mbookmark.exe" #define W3MBOOKMARK_CMDNAME "w3mbookmark.exe"
#define W3MHELPERPANEL_CMDNAME "w3mhelperpanel.exe" #define W3MHELPERPANEL_CMDNAME "w3mhelperpanel.exe"
#define DEV_NULL_PATH "nul" #define DEV_NULL_PATH "nul"
#define DEV_TTY_PATH "con" #define DEV_TTY_PATH "con"
#define CGI_EXTENSION ".cmd" #define CGI_EXTENSION ".cmd"
#define USE_PATH_ENVVAR
#else #else
#define GUNZIP_CMDNAME "gunzip"
#define BUNZIP2_CMDNAME "bunzip2"
#define INFLATE_CMDNAME "inflate"
#define W3MBOOKMARK_CMDNAME "w3mbookmark" #define W3MBOOKMARK_CMDNAME "w3mbookmark"
#define W3MHELPERPANEL_CMDNAME "w3mhelperpanel" #define W3MHELPERPANEL_CMDNAME "w3mhelperpanel"
#define DEV_NULL_PATH "/dev/null" #define DEV_NULL_PATH "/dev/null"
@@ -2080,6 +2087,11 @@ $def_ipv6_ss_family
#define CGI_EXTENSION ".cgi" #define CGI_EXTENSION ".cgi"
#endif #endif
#define PATH_SEPARATOR ':'
#define GUNZIP_NAME "gunzip"
#define BUNZIP2_NAME "bunzip2"
#define INFLATE_NAME "inflate"
#endif /* makefile_parameter */ #endif /* makefile_parameter */
#endif /* _CONFIGURED_ */ #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 "fm.h"
#include <sys/types.h> #include <sys/types.h>
#include "myctype.h" #include "myctype.h"
@@ -23,7 +23,7 @@
#define min(a,b) ((a) > (b) ? (b) : (a)) #define min(a,b) ((a) > (b) ? (b) : (a))
#endif /* not min */ #endif /* not min */
static void gunzip_stream(URLFile *uf); static void uncompress_stream(URLFile *uf);
static FILE *lessopen_stream(char *path); static FILE *lessopen_stream(char *path);
static Buffer *loadcmdout(char *cmd, static Buffer *loadcmdout(char *cmd,
Buffer *(*loadproc) (URLFile *, Buffer *), Buffer *(*loadproc) (URLFile *, Buffer *),
@@ -143,6 +143,26 @@ char *violations[COO_EMAX] = {
}; };
#endif #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 #define SAVE_BUF_SIZE 1536
static MySignalHandler static MySignalHandler
@@ -223,41 +243,36 @@ static void
check_compression(char *path, URLFile *uf) check_compression(char *path, URLFile *uf)
{ {
int len; int len;
struct compression_decoder *d;
if (path == NULL) if (path == NULL)
return; return;
len = strlen(path); len = strlen(path);
uf->compression = CMP_NOCOMPRESS; uf->compression = CMP_NOCOMPRESS;
if (len > 2 && strcasecmp(&path[len - 2], ".Z") == 0) { for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
uf->compression = CMP_COMPRESS; int elen;
uf->guess_type = "application/x-compress"; if (d->ext == NULL)
} continue;
else if (len > 3 && strcasecmp(&path[len - 3], ".gz") == 0) { elen = strlen(d->ext);
uf->compression = CMP_GZIP; if (len > elen && strcasecmp(&path[len - elen], d->ext) == 0) {
uf->guess_type = "application/x-gzip"; uf->compression = d->type;
} uf->guess_type = d->mime_type;
else if (len > 4 && strcasecmp(&path[len - 4], ".bz2") == 0) { break;
uf->compression = CMP_BZIP2; }
uf->guess_type = "application/x-bzip";
} }
} }
static char * static char *
compress_application_type(int compression) compress_application_type(int compression)
{ {
switch (compression) { struct compression_decoder *d;
case CMP_COMPRESS:
return "application/x-compress"; for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
case CMP_GZIP: if (d->type == compression)
return "application/x-gzip"; return d->mime_type;
case CMP_BZIP2:
return "application/x-bzip";
case CMP_DEFLATE:
return "application/x-deflate";
default:
return NULL;
} }
return NULL;
} }
static char * static char *
@@ -266,21 +281,20 @@ uncompressed_file_type(char *path, char **ext)
int len, slen; int len, slen;
Str fn; Str fn;
char *t0; char *t0;
struct compression_decoder *d;
if (path == NULL) if (path == NULL)
return NULL; return NULL;
len = strlen(path); len = strlen(path);
if (len > 2 && strcasecmp(&path[len - 2], ".Z") == 0) { for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
slen = 2; 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) { if (d->type == CMP_NOCOMPRESS)
slen = 3;
}
else if (len > 4 && strcasecmp(&path[len - 4], ".bz2") == 0) {
slen = 4;
}
else
return NULL; return NULL;
fn = Strnew_charp(path); fn = Strnew_charp(path);
@@ -326,12 +340,71 @@ examineFile(char *path, URLFile *uf)
char *t0 = uncompressed_file_type(path, &ext); char *t0 = uncompressed_file_type(path, &ext);
uf->guess_type = t0; uf->guess_type = t0;
uf->ext = ext; uf->ext = ext;
gunzip_stream(uf); uncompress_stream(uf);
return; 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 * convert line
*/ */
@@ -1263,7 +1336,7 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
if (!(w3m_dump & DUMP_SOURCE) && if (!(w3m_dump & DUMP_SOURCE) &&
(w3m_dump & ~DUMP_FRAME || is_text_type(t) (w3m_dump & ~DUMP_FRAME || is_text_type(t)
|| searchExtViewer(t))) { || searchExtViewer(t))) {
gunzip_stream(&f); uncompress_stream(&f);
uncompressed_file_type(pu.file, &f.ext); uncompressed_file_type(pu.file, &f.ext);
} }
else { else {
@@ -5961,46 +6034,29 @@ checkOverWrite(char *path)
return -1; 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 static void
gunzip_stream(URLFile *uf) uncompress_stream(URLFile *uf)
{ {
int pid1; int pid1;
int fd1[2]; int fd1[2];
char *expand_cmd = GUNZIP_CMD; char *expand_cmd = GUNZIP_CMDNAME;
char *expand_name = GUNZIP_NAME; char *expand_name = GUNZIP_NAME;
char *tmpf = NULL; char *tmpf = NULL;
struct compression_decoder *d;
if (IStype(uf->stream) != IST_ENCODED) { if (IStype(uf->stream) != IST_ENCODED) {
uf->stream = newEncodedStream(uf->stream, uf->encoding); uf->stream = newEncodedStream(uf->stream, uf->encoding);
uf->encoding = ENC_7BIT; uf->encoding = ENC_7BIT;
} }
switch (uf->compression) { for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
case CMP_COMPRESS: if (uf->compression == d->type) {
case CMP_GZIP: if (d->libfile_p)
expand_cmd = GUNZIP_CMD; expand_cmd = libFile(d->cmd);
expand_name = GUNZIP_NAME; else
break; expand_cmd = d->cmd;
case CMP_BZIP2: expand_name = d->name;
expand_cmd = BUNZIP2_CMD; break;
expand_name = BUNZIP2_NAME; }
break;
case CMP_DEFLATE:
expand_cmd = INFLATE_CMD;
expand_name = INFLATE_NAME;
break;
} }
uf->compression = CMP_NOCOMPRESS; 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 * w3m: WWW wo Miru utility
* *
@@ -744,11 +744,7 @@ global char *BookmarkFile init(NULL);
global char *pauth init(NULL); global char *pauth init(NULL);
global Str proxy_auth_cookie init(NULL); global Str proxy_auth_cookie init(NULL);
global int UseExternalDirBuffer init(TRUE); global int UseExternalDirBuffer init(TRUE);
#ifdef __EMX__ global char *DirBufferCommand init("file:///$LIB/dirlist" CGI_EXTENSION);
global char *DirBufferCommand init("file:///$LIB/dirlist.cmd");
#else
global char *DirBufferCommand init("file:///$LIB/dirlist.cgi");
#endif /* __EMX__ */
global int ignore_null_img_alt init(TRUE); global int ignore_null_img_alt init(TRUE);
global struct auth_cookie *Auth_cookie init(NULL); 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); global struct cookie *First_cookie init(NULL);
#endif /* USE_COOKIE */ #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 *mailcap_files init(USER_MAILCAP ", " SYS_MAILCAP);
global char *mimetypes_files init(USER_MIMETYPES ", " SYS_MIMETYPES); 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 "fm.h"
#include "myctype.h" #include "myctype.h"
#include <stdio.h> #include <stdio.h>
@@ -12,22 +12,8 @@ static struct mailcap DefaultMailcap[] = {
{NULL, NULL, 0, NULL, NULL, NULL} {NULL, NULL, 0, NULL, NULL, NULL}
}; };
void static TextList *mailcap_list;
initMailcap() static struct mailcap **UserMailcap;
{
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);
}
int int
mailcapMatch(struct mailcap *mcap, char *type) mailcapMatch(struct mailcap *mcap, char *type)
@@ -124,7 +110,7 @@ matchMailcapAttr(char *p, char *attr, int len, Str *value)
return 0; return 0;
} }
int static int
extractMailcapEntry(char *mcap_entry, struct mailcap *mcap) extractMailcapEntry(char *mcap_entry, struct mailcap *mcap)
{ {
int j, k; int j, k;
@@ -193,7 +179,7 @@ extractMailcapEntry(char *mcap_entry, struct mailcap *mcap)
return 1; return 1;
} }
struct mailcap * static struct mailcap *
loadMailcap(char *filename) loadMailcap(char *filename)
{ {
FILE *f; FILE *f;
@@ -233,6 +219,70 @@ loadMailcap(char *filename)
return mcap; 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 * struct mailcap *
searchExtViewer(char *type) 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. * This file was automatically generated by version 1.7 of cextract.
* Manual editing not recommended. * Manual editing not recommended.
@@ -108,6 +108,7 @@ extern int currentLn(Buffer *buf);
extern void tmpClearBuffer(Buffer *buf); extern void tmpClearBuffer(Buffer *buf);
extern char *filename_extension(char *patch, int is_url); extern char *filename_extension(char *patch, int is_url);
extern void examineFile(char *path, URLFile *uf); extern void examineFile(char *path, URLFile *uf);
extern char *acceptableEncoding();
extern int dir_exist(char *path); extern int dir_exist(char *path);
extern Str convertLine(URLFile *uf, Str line, char *code, int mode); extern Str convertLine(URLFile *uf, Str line, char *code, int mode);
extern Buffer *loadFile(char *path); extern Buffer *loadFile(char *path);
@@ -391,6 +392,7 @@ extern char str_to_code(char *str);
extern char *code_to_str(char code); extern char *code_to_str(char code);
extern void put_sjis(Str os, unsigned char ub, unsigned char lb); extern void put_sjis(Str os, unsigned char ub, unsigned char lb);
#endif /* JP_CHARSET */ #endif /* JP_CHARSET */
extern void initMimeTypes();
extern void free_ssl_ctx(); extern void free_ssl_ctx();
extern ParsedURL *baseURL(Buffer *buf); extern ParsedURL *baseURL(Buffer *buf);
extern int openSocket(char *hostname, char *remoteport_name, 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 int check_no_proxy(char *domain);
extern char *filename_extension(char *path, int is_url); extern char *filename_extension(char *path, int is_url);
extern int mailcapMatch(struct mailcap *mcap, char *type); extern int mailcapMatch(struct mailcap *mcap, char *type);
extern struct mailcap *loadMailcap(char *filename);
extern struct mailcap *searchMailcap(struct mailcap *table, char *type); extern struct mailcap *searchMailcap(struct mailcap *table, char *type);
extern void initMailcap(); extern void initMailcap();
extern char *acceptableMimeTypes();
extern struct mailcap *searchExtViewer(char *type); extern struct mailcap *searchExtViewer(char *type);
extern Str unquote_mailcap(char *qstr, char *type, char *name, char *attr, extern Str unquote_mailcap(char *qstr, char *type, char *name, char *attr,
int *mc_stat); int *mc_stat);
@@ -577,7 +579,6 @@ extern char *guess_save_name(Buffer *buf, char *file);
extern void wrapToggle(void); extern void wrapToggle(void);
extern void saveBufferInfo(void); extern void saveBufferInfo(void);
extern char *get_os2_dft(const char *, char *);
extern void dispVer(void); 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. * Initialization file etc.
*/ */
@@ -1072,73 +1072,6 @@ do_mkdir(const char *dir, long mode)
#define do_mkdir(dir,mode) mkdir(dir,mode) #define do_mkdir(dir,mode) mkdir(dir,mode)
#endif /* not __EMX__ */ #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 void
sync_with_option(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 "fm.h"
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
@@ -134,6 +134,76 @@ sock_log(char *message, ...)
#endif #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 * static char *
DefaultFile(int scheme) DefaultFile(int scheme)
{ {
@@ -1127,10 +1197,15 @@ otherinfo(ParsedURL *target, ParsedURL *current, char *referer)
else else
Strcat_charp(s, UserAgent); Strcat_charp(s, UserAgent);
Strcat_charp(s, "\r\n"); Strcat_charp(s, "\r\n");
Strcat_charp(s,
"Accept: text/*, image/*, audio/*, video/*, application/*\r\n"); Strcat_charp(s, "Accept: ");
Strcat_charp(s, Strcat_charp(s, acceptableMimeTypes());
"Accept-Encoding: gzip, compress, bzip, bzip2, deflate\r\n"); Strcat_charp(s, "\r\n");
Strcat_charp(s, "Accept-Encoding: ");
Strcat_charp(s, acceptableEncoding());
Strcat_charp(s, "\r\n");
Strcat_charp(s, "Accept-Language: "); Strcat_charp(s, "Accept-Language: ");
if (AcceptLang != NULL && *AcceptLang != '\0') { if (AcceptLang != NULL && *AcceptLang != '\0') {
Strcat_charp(s, AcceptLang); Strcat_charp(s, AcceptLang);