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]
