Кириллица в URI
Здравствуйте,
Я так видел, что такие проблемы были, и даже как-то пытались решаться. Интересно узнать, решились ли? А то у меня не работает :(
[#] Ответ на комментарий от archimag 06.04.2014 20:10
То есть майнтейнеры puri принципиально не принимают патчи? И в quicklisp puri-unicode пока не планируется?
[#] Ответ на комментарий от archimag 06.04.2014 20:10
Да, с puri-unicode все работает прекрасно. Спасибо.
[#] Ответ на комментарий от Menschenkindlein 06.04.2014 20:19
> То есть майнтейнеры puri принципиально не принимают патчи?
Ну, он бы принял патч, если бы не было там привязки к babel. А так я делать не захотел. Ну а насчёт quicklisp, то это не ко мне. Но там есть проблема, которая сейчас никак нигде не освещается - совпадение в названиях asd систем (и так сделано специально). Условно, в gentoo есть virtual-пакеты, но в quicklisp такого нет.
[#] Ответ на комментарий от archimag 06.04.2014 20:50
archimag, подскажи, пожалуйста, есть ли возможность в puri-unicode при выполнении
получить не #<PURI:URI http://localhost:8080/%d1%84%d1%8b%d0%b2%d0%b0/>, а #<PURI:URI http://localhost:8080/фыва/>?
Т.е. не приводить урл к виду с процентами. Причем, не столько результат print-object, сколько, например, (puri:uri-path uri)?
Я пробовал менять параметр escape, пробовал трассировать по коду, что-то никак не могу понять, как это победить.
(puri:parse-uri "http://localhost:8080/фыва/")
получить не #<PURI:URI http://localhost:8080/%d1%84%d1%8b%d0%b2%d0%b0/>, а #<PURI:URI http://localhost:8080/фыва/>?
Т.е. не приводить урл к виду с процентами. Причем, не столько результат print-object, сколько, например, (puri:uri-path uri)?
Я пробовал менять параметр escape, пробовал трассировать по коду, что-то никак не могу понять, как это победить.
[#] Ответ на комментарий от dmitrys99 08.07.2014 08:02
> Причем, не столько результат print-object, сколько, например, (puri:uri-path uri)?
Строка "http://localhost:8080/фыва/" не может быть получена, ибо это противоречит соответствующему RFC. Но:
CL-USER> (puri:uri-parsed-path #U"http://localhost:8080/фыва/")
(:ABSOLUTE "фыва" "")
(:ABSOLUTE "фыва" "")
и делай что хочешь. Собственно, весь смысл puri-unicode в том, что puri:uri-parsed-path позволяет получить корректные составляющие path.
[#] Ответ на комментарий от archimag 08.07.2014 12:32
Попробую спросить по-другому.
Есть вызов curl, который делает то, что мне надо:
curl -vX PUT http://localhost:5984/sh-db/555%40vk/Файл.jpg?rev=15-b00a4878e4769a1935cb2a382c3ccd6b --data-binary @Файл.jpg -H "Content-Type:image/jpg"
В документе в БД CouchDB создается вложение с именем "Файл.jpg".
(суть здесь не в том, что это CouchDB, а в том, что curl понимает и передает url в utf-8).
Соответствующий вызов из Lisp:
который, в свою очередь, приводит к вызову http-request.
Возможно, я что-то не понимаю в матчасти и что-то делаю неправильно. Но!
Первый вызов дает мне имя вложения Файл.jpg, второй – %d0%a4%d0%b0%d0%b9%d0%bb.jpg.
Я хочу первый :)
Есть вызов curl, который делает то, что мне надо:
curl -vX PUT http://localhost:5984/sh-db/555%40vk/Файл.jpg?rev=15-b00a4878e4769a1935cb2a382c3ccd6b --data-binary @Файл.jpg -H "Content-Type:image/jpg"
В документе в БД CouchDB создается вложение с именем "Файл.jpg".
(суть здесь не в том, что это CouchDB, а в том, что curl понимает и передает url в utf-8).
Соответствующий вызов из Lisp:
(chillax:put-attachment *users-db* "555@vk" "Файл.jpg" #P"Файл.jpg" :rev "23-9fed9f32def4d73f9818faa0eaec4500")
который, в свою очередь, приводит к вызову http-request.
Возможно, я что-то не понимаю в матчасти и что-то делаю неправильно. Но!
Первый вызов дает мне имя вложения Файл.jpg, второй – %d0%a4%d0%b0%d0%b9%d0%bb.jpg.
Я хочу первый :)
[#] Ответ на комментарий от dmitrys99 10.07.2014 20:22
> curl понимает и передает url в utf-8
Разве? Я попробовал сделать так у себя и:
curl -v PUT http://localhost:8080/sh-db/555%40vk/Файл.jpg * Curl_ipv4_resolve_r failed for PUT * Couldn't resolve host 'PUT' * Closing connection #0 curl: (6) Couldn't resolve host 'PUT' * About to connect() to localhost port 8088 (#0) * Trying 127.0.0.1... * connected * Connected to localhost (127.0.0.1) port 8088 (#0) > GET /sh-db/555%40vk/Файл.jpg HTTP/1.1 > User-Agent: curl/7.26.0 > Host: localhost:8088 > Accept: */* > * HTTP 1.0, assume close after body < HTTP/1.0 400 Bad Request < Connection: close < Your request could not be interpreted by this HTTP server Non-ASCII character in request line * Closing connection #0
(у меня на порту 8080 работает домашний SBCL)
> суть здесь не в том, что это CouchDB
Мне показалось, что именно в этом. Потому что если в браузере (смотрел в Chrome и Firefox) вставить адрес http://localhost:8080/sh-db/555%40vk/Файл.jpg,
то я получаю сообщение:
The requested URL /sh-db/555%40vk/%D0%A4%D0%B0%D0%B9%D0%BB.jpg was not found on this server.
Т.е браузеры так делают всегда, а вот curl так не делает (что видно, когда выполняешь curl -v).
[#] Ответ на комментарий от archimag 06.04.2014 20:10
А как его использовать? Подскажите, пожалуйста.
В лучшем случае
PACKAGE>(restas:define-route test ("/test/test/:(var).html")
(:sift-variables (var #'hunchentoot:url-decode))
var)
Получалось, что английский урл-запрос проходит нормально, а русский ловит ошибку в (:sift-variables ...) и 404 страница при обращении к /test/test/ы.html в виде "страница /test/test/%d1%82.html не найдена".
PACKAGE>(restas:define-route test ("/test/test/:(var).html")
(defvar *test* var))
При таком обращении кириллицей выпадает ошибка что-то вроде Unknown as render *test* via NIL , а в самой тест
PACKAGE> *test*
"Ñ\202"
Без же всякой обработки (:sift-variables ...) на странице вместо русской Т красуется Ñ
В лучшем случае
PACKAGE>(restas:define-route test ("/test/test/:(var).html")
(:sift-variables (var #'hunchentoot:url-decode))
var)
Получалось, что английский урл-запрос проходит нормально, а русский ловит ошибку в (:sift-variables ...) и 404 страница при обращении к /test/test/ы.html в виде "страница /test/test/%d1%82.html не найдена".
PACKAGE>(restas:define-route test ("/test/test/:(var).html")
(defvar *test* var))
При таком обращении кириллицей выпадает ошибка что-то вроде Unknown as render *test* via NIL , а в самой тест
PACKAGE> *test*
"Ñ\202"
Без же всякой обработки (:sift-variables ...) на странице вместо русской Т красуется Ñ
[#] Ответ на комментарий от irmpow 13.12.2014 18:22
> А как его использовать? Подскажите, пожалуйста.
Настроить ASDF и просто установить локально.
Например, у меня в файле ~/.config/common-lisp/source-registry.conf.d/ записано следующее:
(:tree "/home/andrey/development/common-lisp/")
Это заставляет ASDF в первую очередь рекурсивно искать систему в каталоге ~/development/common-lisp.Теперь делаем (для моей системы):
cd ~/development/commonlisp git clone git@github.com:archimag/puri-unicode.gitПосле чего вместо puri будет грузиться puri-unicode.
[#] Ответ на комментарий от archimag 13.12.2014 18:48
Да не, я не про это. В local-projects положил и quicklisp подтягивает вместо оригинала.
Как его прописать в define-route использовать, чтобы кириллические переменные принимать из url?
Как его прописать в define-route использовать, чтобы кириллические переменные принимать из url?
[#] Ответ на комментарий от irmpow 13.12.2014 20:27
> Как его прописать в define-route использовать,
> чтобы кириллические переменные принимать из url?
Для этого ничего специально делать не надо. Если грузиться puri-unicode. а не puri, то всё будет автоматом.
[#] Ответ на комментарий от archimag 13.12.2014 20:35
Огромнейшее спасибо! перезапустил процесс, теперь все переменные могут в кирилицу.