Есть ли способ в hunchentoot получить часть URL-адреса перед путем

Если клиент делает запрос на proto://hostname:port/path, я хотел бы получить proto://hostname:port.

Я мог что-то пропустить, но сейчас единственный способ, который я могу придумать, - это использовать что-то вроде

(format nil "~A://~A" (stringify-downcase-scan (server-protocol*)) (host))

Есть ли какая-либо функция/метод, специфичный для этого или более простой способ?

Основная причина в том, что server-protocol возвращает символ ключевого слова (например, :http/1.1), который мне нужно проанализировать. Конечно, я могу это сделать, но это то, что может быть уже там, и я, возможно, пропустил это.


person Paralife    schedule 19.11.2016    source источник


Ответы (1)


Вы можете установить PURI или QURI для анализа URI:

CL-USER> (describe (quri:uri "proto://hostname:1000/path"))
#<QURI.URI:URI proto://hostname:1000/path>
Type: QURI.URI:URI
Class: #<STRUCTURE-CLASS QURI.URI:URI>
SCHEME: "proto"
USERINFO: NIL
HOST: "hostname"
PORT: 1000
PATH: "/path"
QUERY: NIL
FRAGMENT: NIL

Затем вы можете сделать это:

(quri:render-uri 
 (quri:merge-uris (quri:uri "/")
                  (quri:uri "proto://hostname:1000/path")))

=> "proto://hostname:1000/"

В вашем случае вы можете получить доступ к URI с помощью (request-uri*).

person coredump    schedule 20.11.2016
comment
Спасибо, но я хочу наоборот: получить строку URL перед путем, а не анализировать ее. В контексте запроса hunchentoot у меня неявно есть части: у меня есть хост: порт из метода (хост) и протокол из метода (сервер-протокол). Мне просто нужно проанализировать/отфильтровать ответ последнего, поскольку он возвращает ключевое слово, которое также содержит номер версии. - person Paralife; 22.11.2016
comment
@Paralife Извините, я не уверен, что понимаю, чего вы хотите. Я попытался отредактировать ответ, чтобы предоставить более подробную информацию, но если этого недостаточно, не могли бы вы добавить пример, показывающий, как реализован ваш обработчик? Спасибо - person coredump; 22.11.2016
comment
(запрос-uri*) не возвращает полный URL-адрес. Он возвращает часть после host:port. Чтобы лучше проиллюстрировать мою проблему: можете ли вы привести пример обработчика, который просто выводит то, что есть у клиента в адресной строке? (до первого хэша, конечно) - person Paralife; 26.11.2016
comment
@Paralife Хорошо, теперь я понимаю. Кажется непростым получить весь путь из запроса, возможно, есть способ определить методы вокруг какой-нибудь низкоуровневой универсальной функции Hunchentoot, такой как handle-incoming-connection, но я не пробовал. - person coredump; 26.11.2016