Oleg,

what would be needed is complete support for logical pathnames (which is not present at the moment).  I believe that if the document root is a logical pathname, the incoming URL would need to be converted to a relative logical pathname before it is merged to the document root.

At this point, I am not prepared to work on this myself.  As pathnames are hairy business, I would only want to merge a patch to support logical pathnames if it comes with thorough tests.

Alternatively, I would accept a documentation patch that says that if the document root is a logical pathname, it must not contain a directory or file component. :)

-Hans


2014-02-01 Left Right <olegsivokon@gmail.com>:
Thanks for the answer, Hans,

I'm looking now at the misc.lisp,
create-folder-dispatcher-and-handler, am I right assuming this is the
function that handles paths merging?

If so, I was thinking to override request-pathname on request to
create a URI with the required bits of the pathname. This would seem
to me like a better way to handle it. But I'm not certain what would
it mean in terms of other bits of the code, is it likely to break
other things?

Example:

(merge-pathnames (make-pathname :host "rgol" :name "game" :type
"html") #p"rgol:www;")
#P"RGOL:WWW;GAME.HTML.NEWEST"

The reason I want to do it this way is because merge-pathnames will
only concatenate paths if the default-pathname is trivial: no
directories, wildcards etc. So it seems to me that the original
intention was to simply concatenate paths, but because for trivial
pathnames merge-pathnames worked as concatenation, it was used. Does
it make sense?

Best,

Oleg

On Sat, Feb 1, 2014 at 10:59 AM, Hans Hübner <hans.huebner@gmail.com> wrote:
> Oleg,
>
> the problem seems to be related how logical pathnames are merged.  The
> partial pathname that is created by Hunchentoot and then merged with the
> document root pathname is considered to contain a directory component by CL.
> Therefore, the directory component that you are matching in your logical
> pathname host definition is not present when the two partial pathnames are
> merged.  To work around this behavior, I'd recommend that you define a
> separate logical pathname host for your document root.
>
> TEST-LOGICAL-PATHNAMES> (setf (logical-pathname-translations "TEST")
> '(("foo;*.*.*" "/tmp/*")))
> (("foo;*.*.*" "/tmp/*"))
> TEST-LOGICAL-PATHNAMES> (directory (merge-pathnames "test.txt"
> #P"test:foo;"))
> NIL
> TEST-LOGICAL-PATHNAMES> (setf (logical-pathname-translations "TEST")
> '(("*.*.*" "/tmp/*")))
> (("*.*.*" "/tmp/*"))
> TEST-LOGICAL-PATHNAMES> (directory (merge-pathnames "test.txt"
> #P"test:foo;"))
> (#P"/private/tmp/test.txt")
> TEST-LOGICAL-PATHNAMES> (directory (merge-pathnames "test.txt" #P"test:"))
> (#P"/private/tmp/test.txt")
>
> -Hans
>
>
> 2014-01-31 Left Right <olegsivokon@gmail.com>:
>
>> Sorry, I've copied the wrong log entry, this is the correct one:
>>
>> 127.0.0.1 - [2014-01-31 17:35:44] "GET /game.html HTTP/1.1" 404 188 "-"
>> "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)
>> Chrome/28.0.1500.95 Safari/537.36"
>>
>>
>> On Fri, Jan 31, 2014 at 5:33 PM, Oleg Sivokon <olegsivokon@gmail.com>
>> wrote:
>>>
>>> Hello list,
>>>
>>> There should be something very simple I've overlooked, yet I can't find
>>> it. Hunchentoot seems not to be able to locate the root directory, where
>>> I have my static content, and I can't get it to print any useful
>>> information about it. That's why I'm asking for your help.
>>>
>>> Below is my setup:
>>>
>>> (setf (logical-pathname-translations "rgol")
>>>        '(...
>>>          ("WWW;*.*.*" "/home/wvxvw/.../www/")
>>>          ("WWW;*;*.*.*" "/home/wvxvw/.../www/*")
>>>          ...))
>>>
>>> (make-instance 'hunchentoot:acceptor :port 4242
>>>     :document-root #p"rgol:www;"
>>>     :message-log-destination #p"rgol:logs;messages.log"
>>>     :access-log-destination #p"rgol:logs;access.log")
>>>
>>> I've defined another handler, which doesn't depend on static files, and
>>> it works fine, however, when I try to access static files, the log
>>> record looks like this:
>>>
>>> 127.0.0.1 - [2014-01-31 17:12:40]
>>> "GET /img/made-with-lisp-logo.jpg HTTP/1.1"
>>> 404 206 "http://localhost:4242/game.html"
>>> "Mozilla/5.0 (X11; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0"
>>>
>>> But the file is definitely there, because if I try this in REPL:
>>>
>>> (directory #p"rgol:www;*.*")
>>> (#P"/home/wvxvw/.../www/game.html"
>>>  ... more files ...)
>>>
>>> My version of Hunchentoot is:
>>>
>>> hunchentoot:*hunchentoot-version*
>>> "1.2.17"
>>>
>>> $ sbcl --version
>>> SBCL 1.1.2-1.fc18
>>>
>>> Best,
>>>
>>> Oleg
>>
>>
>