martin      98/01/13 15:29:13

  Modified:    .        STATUS
               src      CHANGES
               src/modules/standard mod_speling.c
  Log:
  Mod_speling would return "multiple choices" with invalid HREF links, when
  finding an abiguous spelling correction. It now returns absolute links,
  as it did in the case of a single matching spelling correction.
  
  Submitted by: [EMAIL PROTECTED] (Soeren Ziehe)
  Reviewed by: Dean Gaudet +1, Jim Jagielski +1, Soeren Ziehe +1
  
  Revision  Changes    Path
  1.86      +1 -5      apachen/STATUS
  
  Index: STATUS
  ===================================================================
  RCS file: /home/cvs/apachen/STATUS,v
  retrieving revision 1.85
  retrieving revision 1.86
  diff -u -u -r1.85 -r1.86
  --- STATUS    1998/01/13 23:10:53     1.85
  +++ STATUS    1998/01/13 23:28:59     1.86
  @@ -80,6 +80,7 @@
       * Brian Havard's [Patch] OS/2 - fix up shut down
       * Dean's [PATCH] make mod_rewrite use ap_cpystrn
       * Martin's [PORT] Make apache compile & run on an EBCDIC mainframe
  +    * Martin's [PATCH] mod_speling [300] Multiple Choices bug (Take 2)
   
   Available Patches:
   
  @@ -102,11 +103,6 @@
       * Dean's [PATCH] yet another slow function
           <[EMAIL PROTECTED]>
        Status: Dean +1, Jim +1, Martin +1, Paul +1
  -
  -    * Martin's [PATCH] mod_speling [300] Multiple Choices bug (Take 2)
  -     Submitted by: Soeren Ziehe <[EMAIL PROTECTED]>
  -     <[EMAIL PROTECTED]>
  -     Status: Martin +1, Dean +1, Jim +1, Soeren +1, [EMAIL PROTECTED] +1
   
       * Marc's [PATCH] PR#1543: suexec logging exec failures
        <[EMAIL PROTECTED]>
  
  
  
  1.565     +8 -0      apachen/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apachen/src/CHANGES,v
  retrieving revision 1.564
  retrieving revision 1.565
  diff -u -u -r1.564 -r1.565
  --- CHANGES   1998/01/13 21:19:07     1.564
  +++ CHANGES   1998/01/13 23:29:10     1.565
  @@ -1,5 +1,13 @@
   Changes with Apache 1.3b4
   
  +  *) Mod_speling returned incorrect HREF's when an ambigous match
  +     was found. Noticed by <[EMAIL PROTECTED]> (Soeren Ziehe)
  +     [EMAIL PROTECTED] (Soeren Ziehe), Martin Kraemer]
  +
  +  *) PORT: Apache now compiles & runs on an EBCDIC mainframe
  +     (the Siemens Nixdorf BS2000-OSD family) in the POSIX subsystem
  +     [Martin Kraemer]
  +
     *) PORT: Fix problem killing children when terminating.  Allow ^C
        to shut down the server.  [Brian Havard]
   
  
  
  
  1.11      +31 -23    apachen/src/modules/standard/mod_speling.c
  
  Index: mod_speling.c
  ===================================================================
  RCS file: /home/cvs/apachen/src/modules/standard/mod_speling.c,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -u -r1.10 -r1.11
  --- mod_speling.c     1998/01/13 22:47:38     1.10
  +++ mod_speling.c     1998/01/13 23:29:13     1.11
  @@ -93,14 +93,14 @@
       void *server_conf = cmd->server->module_config;
   
       /* any non-NULL pointer means speling is enabled */
  -    set_module_config(server_conf, &speling_module, arg ? (void 
*)&speling_module : NULL);
  +    set_module_config(server_conf, &speling_module, arg ? (void *) 
&speling_module : NULL);
       return NULL;
   }
   
   static command_rec speling_cmds[] =
   {
       {"CheckSpelling", set_speling, NULL, RSRC_CONF, FLAG,
  -    "whether or not to fix miscapitalized/misspelled requests"},
  +     "whether or not to fix miscapitalized/misspelled requests"},
       {NULL}
   };
   
  @@ -128,7 +128,7 @@
   typedef struct {
       const char *name;
       sp_reason quality;
  -}      misspelled_file;
  +} misspelled_file;
   
   /*
    * spdist() is taken from Kernighan & Pike,
  @@ -163,7 +163,7 @@
                   return SP_SIMPLETYPO;   /* 1 char mismatch */
           }
           if (strcasecmp(s + 1, t) == 0)
  -            return SP_EXTRACHAR;/* extra character */
  +            return SP_EXTRACHAR;        /* extra character */
       }
       if (*t && strcasecmp(s, t + 1) == 0)
           return SP_MISSINGCHAR;  /* missing character */
  @@ -173,7 +173,7 @@
   static int sort_by_quality(const void *left, const void *rite)
   {
       return (int) (((misspelled_file *) left)->quality)
  -    - (int) (((misspelled_file *) rite)->quality);
  +        - (int) (((misspelled_file *) rite)->quality);
   }
   
   static int check_speling(request_rec *r)
  @@ -205,11 +205,12 @@
        * r->uri: /correct-url/mispelling/more
        * r->filename: /correct-file/mispelling r->path_info: /more
        *
  -     * So we do this in steps. First break r->filename into two peices
  +     * So we do this in steps. First break r->filename into two pieces
        */
   
       filoc = rind(r->filename, '/');
  -    if (filoc == -1)
  +    /* Don't do anything if the request doesn't contain a slash, or requests 
"/" */
  +    if (filoc == -1 || strcmp(r->uri, "/") == 0)
           return DECLINED;
   
       /* good = /correct-file */
  @@ -240,7 +241,7 @@
       if (dotloc == -1)
           dotloc = strlen(bad);
   
  -    while ((dir_entry = readdir(dirp))) {
  +    while ((dir_entry = readdir(dirp)) != NULL) {
           sp_reason q;
   
           /*
  @@ -328,10 +329,8 @@
           /*
            * Conditions for immediate redirection: 
            *     a) the first candidate was not found by stripping the suffix 
  -      * AND b) there exists only one candidate OR the best match is not 
ambigous
  -         * 
  -         * Otherwise, a "[300] Multiple Choices" list with the variants is
  -         * returned.
  +         * AND b) there exists only one candidate OR the best match is not 
ambigous
  +         * then return a redirection right away.
            */
           if (variant[0].quality != SP_VERYDIFFERENT &&
               (candidates->nelts == 1 || variant[0].quality != 
variant[1].quality)) {
  @@ -342,7 +341,7 @@
               table_set(r->headers_out, "Location",
                         construct_url(r->pool, nuri, r->server));
   
  -            aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, r->server,
  +            aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_INFO, r->server,
                           ref ? "Fixed spelling: %s to %s from %s"
                           : "Fixed spelling: %s to %s",
                           r->uri, nuri, ref);
  @@ -367,17 +366,22 @@
                   notes = r->main->notes;
               }
   
  -            /* Generate the reponse text. */
  -            t = pstrcat(p, "The document name you requested (<code>",
  -                     r->uri, "</code>) could not be found on this server.\n"
  -                        "However, we found documents with names similar to 
the one you requested.<p>"
  -                        "Available documents:\n<ul>\n", NULL);
  +            /* Generate the response text. */
  +            /* Since the text is expanded by repeated calls of
  +             * t = pstrcat(p, t, ".."), we can avoid a little waste
  +             * of memory by adding the header AFTER building the list.
  +             * XXX: FIXME: find a way to build a string concatenation
  +             *             without repeatedly requesting new memory
  +             * XXX: FIXME: Limit the list to a maximum number of entries
  +             */
  +            t = "";
   
               for (i = 0; i < candidates->nelts; ++i) {
   
                   /* The format isn't very neat... */
  -                t = pstrcat(p, t, "<li><a href=\"", variant[i].name, "\">",
  -                            variant[i].name, "</a> (",
  +                t = pstrcat(p, t, "<li><a href=\"", url,
  +                            variant[i].name, r->path_info, "\">",
  +                            variant[i].name, r->path_info, "</a> (",
                       sp_reason_str[(int) (variant[i].quality)], ")\n", NULL);
   
                   /*
  @@ -393,7 +397,10 @@
                       t = pstrcat(p, t, "</ul>\nFurthermore, the following 
related documents were found:\n<ul>\n", NULL);
                   }
               }
  -            t = pstrcat(p, t, "</ul>\n", NULL);
  +            t = pstrcat(p, "The document name you requested (<code>",
  +                     r->uri, "</code>) could not be found on this server.\n"
  +                        "However, we found documents with names similar to 
the one you requested.<p>"
  +                        "Available documents:\n<ul>\n", t, "</ul>\n", NULL);
   
               /* If we know there was a referring page, add a note: */
               if (ref != NULL)
  @@ -403,7 +410,7 @@
               /* Pass our table to http_protocol.c (see mod_negotiation): */
               table_set(notes, "variant-list", t);
   
  -            aplog_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, r->server,
  +            aplog_error(APLOG_MARK, APLOG_NOERRNO | APLOG_INFO, r->server,
                           ref ? "Spelling fix: %s: %d candidates from %s"
                           : "Spelling fix: %s: %d candidates",
                           r->uri, candidates->nelts, ref);
  @@ -415,7 +422,8 @@
       return OK;
   }
   
  -module MODULE_VAR_EXPORT speling_module = {
  +module MODULE_VAR_EXPORT speling_module =
  +{
       STANDARD_MODULE_STUFF,
       NULL,                       /* initializer */
       NULL,                       /* create per-dir config */
  
  
  

Reply via email to