diff options
| author | Fumitoshi UKAI <ukai@debian.or.jp> | 2001-11-30 09:54:22 +0000 | 
|---|---|---|
| committer | Fumitoshi UKAI <ukai@debian.or.jp> | 2001-11-30 09:54:22 +0000 | 
| commit | c5cd840adbf340d49711434a9c1a782aa8923fbc (patch) | |
| tree | e0adca641c0e9219d71f33b9e0cb5215474bc6d2 | |
| parent | [w3m-dev 02590] (diff) | |
| download | w3m-c5cd840adbf340d49711434a9c1a782aa8923fbc.tar.gz w3m-c5cd840adbf340d49711434a9c1a782aa8923fbc.zip | |
[w3m-dev 02592] Accept: and AcceptEncoding:
From: Fumitoshi UKAI <ukai@debian.or.jp>
| -rw-r--r-- | ChangeLog | 42 | ||||
| -rwxr-xr-x | configure | 14 | ||||
| -rw-r--r-- | file.c | 184 | ||||
| -rw-r--r-- | fm.h | 12 | ||||
| -rw-r--r-- | mailcap.c | 88 | ||||
| -rw-r--r-- | proto.h | 7 | ||||
| -rw-r--r-- | rc.c | 69 | ||||
| -rw-r--r-- | url.c | 85 | 
8 files changed, 331 insertions, 170 deletions
| @@ -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] @@ -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_ */ @@ -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; -    } -    else if (len > 3 && strcasecmp(&path[len - 3], ".gz") == 0) { -	slen = 3; -    } -    else if (len > 4 && strcasecmp(&path[len - 4], ".bz2") == 0) { -	slen = 4; +    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 (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; @@ -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); @@ -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)  { @@ -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,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)  { @@ -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); | 
