Как включить drakma для обработки нелатинских символов 1 в URL

Я обнаружил ошибку, вызванную не латинскими символами 1, используемыми в данном URL с использованием sbcl, например:

(drakma:http-request "http://www.youtube.com/„weird-url")

debugger invoked on a FLEXI-STREAMS:EXTERNAL-FORMAT-ENCODING-ERROR in thread
#<THREAD "initial thread" RUNNING {1002998D23}>:
  #\DOUBLE_LOW-9_QUOTATION_MARK (code 8222) is not a LATIN-1 character.

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(FLEXI-STREAMS::SIGNAL-ENCODING-ERROR
 #<FLEXI-STREAMS::FLEXI-LATIN-1-FORMAT (:ISO-8859-1 :EOL-STYLE :LF)
   {1002F196E3}>
 "~S (code ~A) is not a LATIN-1 character."
 #\DOUBLE_LOW-9_QUOTATION_MARK
 8222)

Очевидно, что заголовки определены для отправки в Latin-1 с помощью RFC2616(это билет, который я открыл на github после обнаружения этой ошибки), и поэтому URL должен быть правильно закодирован перед передачей в drakma. Но я понятия не имею, как, по-видимому, невозможно (так как это не символ LATIN-1) сделать это?

Каким будет рабочий вызов для моего примера (помимо того, что URL-адрес является поддельным и может быть сокращен до http://www.youtube.com/)?

(drakma:http-request (magic-encoding-function "http://www.youtube.com/„weird-url"))

2 ответа

Просто выяснили, что если недостаток заключается в последующей обработке вновь созданного объекта, то обходной путь может состоять в том, чтобы разделить процесс на две части:

  1. Создайте URI только с частью Latin-1.
  2. Установить путь

Это было бы как:

(let ((uri (puri:uri "https://wikimedia.org"))) (setf (puri:uri-path uri) (concatenate 'string "/" (drakma:url-encode "/кадабра" :utf-8))) uri) Производит:

#<PURI:URI https://wikimedia.org/%D0%BA%D0%B0%D0%B4%D0%B0%D0%B1%D1%80%D0%B0>

Затем Дракма принимает этот URI без какой-либо дополнительной обработки.

Эта проблема не касается ДРАКМА. Это вина PURI. Я использую мой форк PURI: https://github.com/archimag/puri-unicode.

Другие вопросы по тегам