You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by dg...@hyperreal.org on 1998/03/12 11:29:14 UTC

cvs commit: apache-1.3/src/os/win32 mod_isapi.c

dgaudet     98/03/12 02:29:14

  Modified:    src      CHANGES
               src/include http_config.h httpd.h
               src/main http_config.c util_script.c
               src/modules/example mod_example.c
               src/modules/standard mod_alias.c mod_autoindex.c
                        mod_cern_meta.c mod_include.c mod_mime.c
                        mod_mime_magic.c mod_negotiation.c mod_rewrite.c
               src/os/bs2000 os.c
               src/os/win32 mod_isapi.c
  Log:
  As mentioned a month or two ago there were some implicit assumptions that
  the values in content_type, handler, content_encoding, ... were lowercase.
  I'm not referring to mod_negotiation here -- there were other cases where
  strcmp() was being used.  But in addition, mod_negotiation could be
  convinced to call str_tolower() on r->content_language(s), which could
  possibly modify a "read-only" string... which wastes at least one memory
  page per child.
  
  Clean all that up by declaring that the content fields in request_rec
  (and related fields elsewhere) must be lowercase, and must not be modified
  in place.  Naturally I chose this because it's more efficient... rather
  than going around needlessly pstrdup()ing and strcasecmp()ing everywhere.
  
  There are a few other tweaks in here I couldn't resist, along the lines
  of getting rid of unneeded pstrdup()s.  Plus a new function
  set_string_slot_lower().
  
  Revision  Changes    Path
  1.701     +25 -14    apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.700
  retrieving revision 1.701
  diff -u -r1.700 -r1.701
  --- CHANGES	1998/03/11 09:57:23	1.700
  +++ CHANGES	1998/03/12 10:28:52	1.701
  @@ -1,5 +1,16 @@
   Changes with Apache 1.3b6
   
  +  *) API: Clarify usage of content_type, handler, content_encoding,
  +     content_language and content_languages fields in request_rec.  They
  +     must always be lowercased; and the strings pointed to shouldn't
  +     be modified (you must copy them to modify them).  Fix a few bugs
  +     related to this.  [Dean Gaudet]
  +
  +  *) API: Clarification: except for RAW_ARGS, all command handlers can
  +     treat the char * parameters as permanent, and modifiable.  There
  +     is no need to pstrdup() them.  Clean up some needless pstrdup().
  +     [Dean Gaudet]
  +
     *) Now mod_so keeps track of which module shared objects with which names
        are loaded and thus avoids multiple loading and unloading and irritating
        error_log messages. [Ralf S. Engelschall]
  @@ -94,10 +105,10 @@
     *) WIN32: Preserve trailing slash in canonical path (and hence
   	   in PATH_INFO). [Paul Sutton, Ben Laurie]
   
  -  *) USE_PTHREAD_SERIALIZED_ACCEPT has proven unreliable depending on
  -     the rev of Solaris and what mixture of modules are in use.  So
  -     it has been disabled, and Solaris is back to using
  -     USE_FCNTL_SERIALIZED_ACCEPT.  Users may experiment with
  +  *) PORT: USE_PTHREAD_SERIALIZED_ACCEPT has proven unreliable
  +     depending on the rev of Solaris and what mixture of modules
  +     are in use.  So it has been disabled, and Solaris is back to
  +     using USE_FCNTL_SERIALIZED_ACCEPT.  Users may experiment with
        USE_PTHREAD_SERIALIZED_ACCEPT at their own risk, it may speed
        up static content only servers.  Or it may fail unpredictably.
        [Dean Gaudet] PR#1779, 1854, 1904
  @@ -105,11 +116,11 @@
     *) mod_test_util_uri.c created which tests the logic in util_uri.c.
        [Dean Gaudet]
   
  -  *) Rewrite of absoluteURI handling, and in particular how absoluteURIs
  -     match vhosts.  Unless a request is a proxy request, a "http://host"
  -     url is treated as if a similar "Host:" header had been supplied.
  -     This change was made to support future HTTP/1.x protocols which
  -     may require clients to send absoluteURIs for all requests.
  +  *) API: Rewrite of absoluteURI handling, and in particular how
  +     absoluteURIs match vhosts.  Unless a request is a proxy request, a
  +     "http://host" url is treated as if a similar "Host:" header had been
  +     supplied.  This change was made to support future HTTP/1.x protocols
  +     which may require clients to send absoluteURIs for all requests.
   
        In order to achieve this change subtle changes were made to the API.  In a
        request_rec, r->hostlen has been removed.  r->unparsed_uri now exists so
  @@ -123,9 +134,9 @@
        managed by the same httpd.
        [Dean Gaudet]
   
  -  *) Cleanup of code in http_vhost.c, and remove vhost matching code from
  -     mod_rewrite.  The vhost matching is now performed by a globally
  -     available function matches_request_vhost().  [Dean Gaudet]
  +  *) API: Cleanup of code in http_vhost.c, and remove vhost matching
  +     code from mod_rewrite.  The vhost matching is now performed by a
  +     globally available function matches_request_vhost().  [Dean Gaudet]
   
     *) Reduce memory usage, and speed up ServerAlias support.  As a
        side-effect users can list multiple ServerAlias directives
  @@ -247,7 +258,7 @@
        loop if RLimitMem was used with a small amount of memory -- too small
        for the signal stack frame to be set up.  [Dean Gaudet]
   
  -  *) Fix problems with absoluteURIs.  [Dean Gaudet,
  +  *) Fix problems with absoluteURIs introduced during 1.3b4.  [Dean Gaudet,
        Alvaro Martinez Echevarria <al...@lander.es>]
   
     *) Fix multiple UserDir problem introduced during 1.3b4-dev.
  @@ -309,7 +320,7 @@
        (but note /~../.. was handled properly).
        [Lauri Jesmin <je...@ut.ee>] PR#1701
   
  -  *) os_is_path_absolute() now takes a const char * instead of a char *.
  +  *) API: os_is_path_absolute() now takes a const char * instead of a char *.
        [Dean Gaudet]
   
   Changes with Apache 1.3b5
  
  
  
  1.71      +7 -1      apache-1.3/src/include/http_config.h
  
  Index: http_config.h
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/include/http_config.h,v
  retrieving revision 1.70
  retrieving revision 1.71
  diff -u -r1.70 -r1.71
  --- http_config.h	1998/03/05 18:58:34	1.70
  +++ http_config.h	1998/03/12 10:28:55	1.71
  @@ -60,6 +60,11 @@
   
   /* Command dispatch structures... */
   
  +/* Note that for all of these except RAW_ARGS, the config routine is
  + * passed a freshly allocated string which can be modified or stored
  + * or whatever... it's only necessary to do pstrdup() stuff with
  + * RAW_ARGS.
  + */
   enum cmd_how {
       RAW_ARGS,			/* cmd_func parses command line itself */
       TAKE1,			/* one argument only */
  @@ -162,7 +167,7 @@
   /* This structure records the existence of handlers in a module... */
   
   typedef struct {
  -    char *content_type;
  +    const char *content_type;	/* MUST be all lower case */
       int (*handler) (request_rec *);
   } handler_rec;
   
  @@ -275,6 +280,7 @@
   /* Generic command handling function... */
   
   API_EXPORT_NONSTD(const char *) set_string_slot(cmd_parms *, char *, char *);
  +API_EXPORT_NONSTD(const char *) set_string_slot_lower(cmd_parms *, char *, char *);
   API_EXPORT_NONSTD(const char *) set_flag_slot(cmd_parms *, char *, int);
   API_EXPORT_NONSTD(const char *) set_file_slot(cmd_parms *, char *, char *);
   
  
  
  
  1.197     +5 -1      apache-1.3/src/include/httpd.h
  
  Index: httpd.h
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/include/httpd.h,v
  retrieving revision 1.196
  retrieving revision 1.197
  diff -u -r1.196 -r1.197
  --- httpd.h	1998/03/11 19:11:09	1.196
  +++ httpd.h	1998/03/12 10:28:55	1.197
  @@ -174,7 +174,7 @@
   #endif
   
   /* Define this to be what type you'd like returned for files with unknown */
  -/* suffixes */
  +/* suffixes.  MUST be all lower case. */
   #ifndef DEFAULT_CONTENT_TYPE
   #define DEFAULT_CONTENT_TYPE "text/plain"
   #endif
  @@ -642,6 +642,10 @@
       table *subprocess_env;
       table *notes;
   
  +    /* content_type, handler, content_encoding, content_language, and all
  +     * content_languages MUST be lowercased strings.  They may be pointers
  +     * to static strings; they should not be modified in place.
  +     */
       char *content_type;		/* Break these out --- we dispatch on 'em */
       char *handler;		/* What we *really* dispatch on           */
   
  
  
  
  1.101     +15 -4     apache-1.3/src/main/http_config.c
  
  Index: http_config.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/main/http_config.c,v
  retrieving revision 1.100
  retrieving revision 1.101
  diff -u -r1.100 -r1.101
  --- http_config.c	1998/03/02 06:51:06	1.100
  +++ http_config.c	1998/03/12 10:28:57	1.101
  @@ -434,7 +434,7 @@
   	    continue;
   
   	for (handp = modp->handlers; handp->content_type; ++handp) {
  -	    if (!strcasecmp(handler, handp->content_type)) {
  +	    if (!strcmp(handler, handp->content_type)) {
   		int result = (*handp->handler) (r);
   
   		if (result != DECLINED)
  @@ -458,7 +458,7 @@
   
   	    len = starp - handp->content_type;
   
  -	    if (!len || !strncasecmp(handler, handp->content_type, len)) {
  +	    if (!len || !strncmp(handler, handp->content_type, len)) {
   		int result = (*handp->handler) (r);
   
   		if (result != DECLINED)
  @@ -906,7 +906,18 @@
       /* This one's pretty generic... */
   
       int offset = (int) (long) cmd->info;
  -    *(char **) (struct_ptr + offset) = pstrdup(cmd->pool, arg);
  +    *(char **) (struct_ptr + offset) = arg;
  +    return NULL;
  +}
  +
  +API_EXPORT_NONSTD(const char *) set_string_slot_lower(cmd_parms *cmd,
  +						char *struct_ptr, char *arg)
  +{
  +    /* This one's pretty generic... */
  +
  +    int offset = (int) (long) cmd->info;
  +    str_tolower(arg);
  +    *(char **) (struct_ptr + offset) = arg;
       return NULL;
   }
   
  @@ -928,7 +939,7 @@
       char *p;
       int offset = (int) (long) cmd->info;
       if (os_is_path_absolute(arg))
  -	p = pstrdup(cmd->pool, arg);
  +	p = arg;
       else
   	p = make_full_path(cmd->pool, server_root, arg);
       *(char **) (struct_ptr + offset) = p;
  
  
  
  1.101     +1 -0      apache-1.3/src/main/util_script.c
  
  Index: util_script.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/main/util_script.c,v
  retrieving revision 1.100
  retrieving revision 1.101
  diff -u -r1.100 -r1.101
  --- util_script.c	1998/03/10 06:30:49	1.100
  +++ util_script.c	1998/03/12 10:28:58	1.101
  @@ -470,6 +470,7 @@
   		*endp-- = '\0';
   
   	    r->content_type = pstrdup(r->pool, l);
  +	    str_tolower(r->content_type);
   	}
   	else if (!strcasecmp(w, "Status")) {
   	    sscanf(l, "%d", &r->status);
  
  
  
  1.25      +2 -1      apache-1.3/src/modules/example/mod_example.c
  
  Index: mod_example.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/example/mod_example.c,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- mod_example.c	1998/03/04 02:28:20	1.24
  +++ mod_example.c	1998/03/12 10:29:00	1.25
  @@ -492,7 +492,8 @@
        * where you set the "Content-type" header, and you do so by putting it in
        * r->content_type, *not* r->headers_out("Content-type").  If you don't
        * set it, it will be filled in with the server's default type (typically
  -     * "text/plain").
  +     * "text/plain").  You *must* also ensure that r->content_type is lower
  +     * case.
        *
        * We also need to start a timer so the server can know if the connexion
        * is broken.
  
  
  
  1.31      +1 -1      apache-1.3/src/modules/standard/mod_alias.c
  
  Index: mod_alias.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_alias.c,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- mod_alias.c	1998/01/26 19:50:19	1.30
  +++ mod_alias.c	1998/03/12 10:29:02	1.31
  @@ -327,7 +327,7 @@
   
   	if (found) {
   	    if (p->handler) {	/* Set handler, and leave a note for mod_cgi */
  -		r->handler = pstrdup(r->pool, p->handler);
  +		r->handler = p->handler;
   		table_setn(r->notes, "alias-forced-type", r->handler);
   	    }
   
  
  
  
  1.70      +2 -2      apache-1.3/src/modules/standard/mod_autoindex.c
  
  Index: mod_autoindex.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_autoindex.c,v
  retrieving revision 1.69
  retrieving revision 1.70
  diff -u -r1.69 -r1.70
  --- mod_autoindex.c	1998/03/06 04:25:45	1.69
  +++ mod_autoindex.c	1998/03/12 10:29:03	1.70
  @@ -618,8 +618,8 @@
   	return NULL;
       }
       if (r->content_type
  -	&& (!strcasecmp(r->content_type, "text/html")
  -	    || !strcasecmp(r->content_type, INCLUDES_MAGIC_TYPE))
  +	&& (!strcmp(r->content_type, "text/html")
  +	    || !strcmp(r->content_type, INCLUDES_MAGIC_TYPE))
   	&& !r->content_encoding) {
   	if (!(thefile = pfopen(r->pool, r->filename, "r")))
   	         return NULL;
  
  
  
  1.25      +1 -0      apache-1.3/src/modules/standard/mod_cern_meta.c
  
  Index: mod_cern_meta.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_cern_meta.c,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- mod_cern_meta.c	1998/01/07 16:46:46	1.24
  +++ mod_cern_meta.c	1998/03/12 10:29:03	1.25
  @@ -264,6 +264,7 @@
   		*endp-- = '\0';
   
   	    r->content_type = pstrdup(r->pool, l);
  +	    str_tolower(r->content_type);
   	}
   	else if (!strcasecmp(w, "Status")) {
   	    sscanf(l, "%d", &r->status);
  
  
  
  1.75      +1 -1      apache-1.3/src/modules/standard/mod_include.c
  
  Index: mod_include.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_include.c,v
  retrieving revision 1.74
  retrieving revision 1.75
  diff -u -r1.74 -r1.75
  --- mod_include.c	1998/03/10 09:42:45	1.74
  +++ mod_include.c	1998/03/12 10:29:04	1.75
  @@ -667,7 +667,7 @@
               }
   
               if (!error_fmt && noexec && rr->content_type
  -                && (strncasecmp(rr->content_type, "text/", 5))) {
  +                && (strncmp(rr->content_type, "text/", 5))) {
                   error_fmt = "unable to include potential exec \"%s\" "
                       "in parsed file %s";
               }
  
  
  
  1.32      +13 -10    apache-1.3/src/modules/standard/mod_mime.c
  
  Index: mod_mime.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_mime.c,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- mod_mime.c	1998/02/12 01:09:44	1.31
  +++ mod_mime.c	1998/03/12 10:29:05	1.32
  @@ -118,7 +118,8 @@
   {
       if (*ext == '.')
           ++ext;
  -    table_set(m->forced_types, ext, ct);
  +    str_tolower(ct);
  +    table_setn(m->forced_types, ext, ct);
       return NULL;
   }
   
  @@ -127,7 +128,8 @@
   {
       if (*ext == '.')
           ++ext;
  -    table_set(m->encoding_types, ext, enc);
  +    str_tolower(enc);
  +    table_setn(m->encoding_types, ext, enc);
       return NULL;
   }
   
  @@ -136,7 +138,8 @@
   {
       if (*ext == '.')
           ++ext;
  -    table_set(m->language_types, ext, lang);
  +    str_tolower(lang);
  +    table_setn(m->language_types, ext, lang);
       return NULL;
   }
   
  @@ -145,7 +148,8 @@
   {
       if (*ext == '.')
           ++ext;
  -    table_set(m->handlers, ext, hdlr);
  +    str_tolower(hdlr);
  +    table_setn(m->handlers, ext, hdlr);
       return NULL;
   }
   
  @@ -155,8 +159,7 @@
   
   static const char *set_types_config(cmd_parms *cmd, void *dummy, char *arg)
   {
  -    set_module_config(cmd->server->module_config, &mime_module,
  -                      pstrdup(cmd->pool, arg));
  +    set_module_config(cmd->server->module_config, &mime_module, arg);
       return NULL;
   }
   
  @@ -170,9 +173,9 @@
        "a language (e.g., fr), followed by one or more file extensions"},
       {"AddHandler", add_handler, NULL, OR_FILEINFO, ITERATE2,
        "a handler name followed by one or more file extensions"},
  -  {"ForceType", set_string_slot, (void *) XtOffsetOf(mime_dir_config, type),
  +  {"ForceType", set_string_slot_lower, (void *) XtOffsetOf(mime_dir_config, type),
      OR_FILEINFO, TAKE1, "a media type"},
  -    {"SetHandler", set_string_slot, (void *) XtOffsetOf(mime_dir_config, handler),
  +    {"SetHandler", set_string_slot_lower, (void *) XtOffsetOf(mime_dir_config, handler),
        OR_FILEINFO, TAKE1, "a handler name"},
       {"TypesConfig", set_types_config, NULL, RSRC_CONF, TAKE1,
        "the MIME types config file"},
  @@ -310,9 +313,9 @@
       /* Check for overrides with ForceType/SetHandler */
   
       if (conf->type && strcmp(conf->type, "none"))
  -        r->content_type = pstrdup(r->pool, conf->type);
  +        r->content_type = conf->type;
       if (conf->handler && strcmp(conf->handler, "none"))
  -        r->handler = pstrdup(r->pool, conf->handler);
  +        r->handler = conf->handler;
   
       if (!r->content_type)
           return DECLINED;
  
  
  
  1.27      +8 -2      apache-1.3/src/modules/standard/mod_mime_magic.c
  
  Index: mod_mime_magic.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_mime_magic.c,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- mod_mime_magic.c	1998/03/06 08:52:01	1.26
  +++ mod_mime_magic.c	1998/03/12 10:29:05	1.27
  @@ -810,10 +810,16 @@
       if (state == rsl_subtype || state == rsl_encoding ||
   	state == rsl_encoding) {
   	r->content_type = rsl_strdup(r, type_frag, type_pos, type_len);
  +	/* XXX: this could be done at config time I'm sure... but I'm
  +	 * confused by all this magic_rsl stuff. -djg */
  +	str_tolower(r->content_type);
       }
       if (state == rsl_encoding) {
   	r->content_encoding = rsl_strdup(r, encoding_frag,
   					 encoding_pos, encoding_len);
  +	/* XXX: this could be done at config time I'm sure... but I'm
  +	 * confused by all this magic_rsl stuff. -djg */
  +	str_tolower(r->content_encoding);
       }
   
       /* detect memory allocation errors */
  @@ -2075,7 +2081,7 @@
       int maglen;
       char *argv[3];
       int silent;
  -    char *encoding;
  +    char *encoding;	/* MUST be lowercase */
   } compr[] = {
   
       {
  @@ -2121,7 +2127,7 @@
   	tryit(r, newbuf, newsize);
   
   	/* set encoding type in the request record */
  -	r->content_encoding = pstrdup(r->pool, compr[i].encoding);
  +	r->content_encoding = compr[i].encoding;
       }
       return 1;
   }
  
  
  
  1.72      +2 -12     apache-1.3/src/modules/standard/mod_negotiation.c
  
  Index: mod_negotiation.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_negotiation.c,v
  retrieving revision 1.71
  retrieving revision 1.72
  diff -u -r1.71 -r1.72
  --- mod_negotiation.c	1998/02/12 02:18:43	1.71
  +++ mod_negotiation.c	1998/03/12 10:29:07	1.72
  @@ -153,7 +153,7 @@
    */
   
   typedef struct accept_rec {
  -    char *type_name;
  +    char *type_name;		/* MUST be lowercase */
       float quality;
       float max_bytes;
       float level;
  @@ -174,7 +174,7 @@
   
   typedef struct var_rec {
       request_rec *sub_req;       /* May be NULL (is, for map files) */
  -    char *type_name;
  +    char *type_name;		/* MUST be lowercase */
       char *file_name;
       char *content_encoding;
       array_header *content_languages;    /* list of languages for this variant */
  @@ -749,7 +749,6 @@
               }
               else if (!strncmp(buffer, "content-encoding:", 17)) {
                   mime_info.content_encoding = get_token(neg->pool, &body, 0);
  -                str_tolower(mime_info.content_encoding);
               }
               else if (!strncmp(buffer, "description:", 12)) {
                   mime_info.description = get_token(neg->pool, &body, 0);
  @@ -861,18 +860,9 @@
           mime_info.file_name = pstrdup(neg->pool, dir_entry->d_name);
           if (sub_req->content_encoding) {
               mime_info.content_encoding = sub_req->content_encoding;
  -            str_tolower(mime_info.content_encoding);
           }
           if (sub_req->content_languages) {
  -            int i;
  -
               mime_info.content_languages = sub_req->content_languages;
  -            if (mime_info.content_languages) {
  -                for (i = 0; i < mime_info.content_languages->nelts; ++i) {
  -                    str_tolower(((char **)
  -                                 (mime_info.content_languages->elts))[i]);
  -                }
  -            }
           }
   
           get_entry(neg->pool, &accept_info, sub_req->content_type);
  
  
  
  1.91      +1 -0      apache-1.3/src/modules/standard/mod_rewrite.c
  
  Index: mod_rewrite.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_rewrite.c,v
  retrieving revision 1.90
  retrieving revision 1.91
  diff -u -r1.90 -r1.91
  --- mod_rewrite.c	1998/03/09 22:43:02	1.90
  +++ mod_rewrite.c	1998/03/12 10:29:08	1.91
  @@ -820,6 +820,7 @@
       else if (   strcasecmp(key, "type") == 0
                || strcasecmp(key, "T") == 0   ) {
           cfg->forced_mimetype = pstrdup(p, val);
  +	str_tolower(cfg->forced_mimetype);
       }
       else if (   strcasecmp(key, "env") == 0
                || strcasecmp(key, "E") == 0   ) {
  
  
  
  1.4       +2 -2      apache-1.3/src/os/bs2000/os.c
  
  Index: os.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/os/bs2000/os.c,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- os.c	1998/02/03 16:55:30	1.3
  +++ os.c	1998/03/12 10:29:12	1.4
  @@ -76,8 +76,8 @@
       convert_to_ascii = (r->content_type == NULL);
   
       /* Conversion is applied to text/ files only, if ever. */
  -    if (r->content_type && strncasecmp(r->content_type, "text/", 5)==0) {
  -        if (strncasecmp(r->content_type, ASCIITEXT_MAGIC_TYPE_PREFIX, 
  +    if (r->content_type && strncmp(r->content_type, "text/", 5)==0) {
  +        if (strncmp(r->content_type, ASCIITEXT_MAGIC_TYPE_PREFIX, 
           sizeof(ASCIITEXT_MAGIC_TYPE_PREFIX)-1) == 0)
           r->content_type = pstrcat(r->pool, "text/",
           r->content_type+sizeof(ASCIITEXT_MAGIC_TYPE_PREFIX)-1, NULL);
  
  
  
  1.8       +1 -0      apache-1.3/src/os/win32/mod_isapi.c
  
  Index: mod_isapi.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/os/win32/mod_isapi.c,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- mod_isapi.c	1998/02/03 07:29:53	1.7
  +++ mod_isapi.c	1998/03/12 10:29:13	1.8
  @@ -457,6 +457,7 @@
   		while (endp > value && isspace(*endp)) *endp-- = '\0';
               
   		r->content_type = pstrdup (r->pool, value);
  +		str_tolower(r->content_type);
   	    }
   	    else if (!strcasecmp(data, "Content-Length")) {
   		table_set(r->headers_out, data, value);