I don't know the code well enough to comment on that aspect of it but on the
idea of using the user-supplied host name in redirect I like the idea.  I use
a piece of tcl code that does the same thing and it's worked great for me.

On Friday 07 December 2001 02:42 pm, you wrote:
> At BNA we have a problem with use of AOLserver in terms of
> how it handles the Location parameter value.  The Location
> is a fixed value that is a "global constant" for the
> AOLserver process.
>
> In our virtual hosting environment on our production
> machines this a problem.  The problem is as follows:
>
> The machine host name is >>> xyz.bna.com
> One of many virtual host names is >>> productA.bna.com
> User requests >>>  http://productA.bna.com/AAAA
> (notice that there is no / at the end of the user request)
>
> According to spec AOLserver should redirect to the complete
> url.
> Wanted behavior is a redirect to >>>
> http://productA.bna.com/AAAA/
>
> actual behavior is a redirect to >>>
> http://xyz.bna.com/AAAA/
>
> Our location is the machine name because we can only set
> one.  But one location is not sufficient for our needs.  I
> am aware of the many different Virtual Hosting solutions
> that are proposed for AOLserver.  But we found a way to fix
> our problem without actually needing to use any of the
> currently specified Virtual Hosting approaches.  I would
> like to get your opinion on our approach to solving our
> problem.
>
> In nsd/return.c we have modified the function
> Ns_ConnReturnRedirect.  Please note the additional block of
> code marked with a "ZZZ BNA" comment.  What this does is
> return the user specified host name in preference to the
> Location value.  This solves our particular problem.  It is
> not a Virtual Hosting solution per se, but it does solve our
> problem.
>
> My question is: Do any of you who know the code better than
> we do think this is a dangerous thing to do?  If so where
> should I look in the code to see the danger?  Our testing
> has shown no problems with this change, at least not so far!
>
> Here is the modified source code:
>
> Ns_ConnReturnRedirect(Ns_Conn *conn, char *url)
> {
>     Ns_DString ds, msg;
>     int        result;
>     char*      host;
>
>     Ns_DStringInit(&ds);
>     Ns_DStringInit(&msg);
>     if (url != NULL) {
>         if (*url == '/') {
>
>             /* ZZZ BNA - we look for a host entry before
> defaulting
>                to the location value.
>             */
>             host = Ns_SetGet(conn->headers, "Host");
>             if (host) {
>                 Ns_DStringAppend(&ds, "http://";);
>                 Ns_DStringAppend(&ds, host);
>             } else {
>                 Ns_DStringAppend(&ds,
> Ns_ConnLocation(conn));
>             }
>         }
>         Ns_DStringAppend(&ds, url);
>         Ns_HeadersPut(conn, "Location", ds.string);
>      Ns_DStringVarAppend(&msg, "<A HREF=\"", ds.string,
>                    "\">The requested URL has moved
> here.</A>", NULL);
>      result = Ns_ReturnNotice(conn, 302, "Redirection",
> msg.string);
>     } else {
>      result = Ns_ReturnNotice(conn, 204, "No Content",
> msg.string);
>     }
>     Ns_DStringFree(&msg);
>     Ns_DStringFree(&ds);
>     return result;
> }
>
> Thanks for the help!
>
> /pgw
> Greg Wolff
> [EMAIL PROTECTED]

Reply via email to