It appears that drakma is encoding plus signs (+) in query parameters, turning them into %2B when they should be left alone. This confuses the server in this case. You can see that if I use the :parameters keyword the request fails, but if I include the same parameters as part of the URL the request succeeds.
* (setq drakma:*header-stream* *standard-output*)
#<SYNONYM-STREAM :SYMBOL SB-SYS:*STDOUT* {91260B9}> * (drakma:http-request "http://freedb.org/~cddb/cddb.cgi" :parameters '(("cmd" . "cddb+lscat") ("hello" . "user+host+freedb+1.0") ("proto" . "6"))) GET /~cddb/cddb.cgi?cmd=cddb%2Blscat&hello=user%2Bhost%2Bfreedb%2B1.0&proto=6 HTTP/1.1 Host: freedb.org User-Agent: Drakma/0.11.5 (SBCL 1.0.11.debian; Linux; 2.6.24-19-generic; http://weitz.de/drakma/) Accept: */* Connection: close
HTTP/1.1 200 OK Date: Mon, 07 Jul 2008 14:17:36 GMT Server: Apache/2.0.54 (Debian GNU/Linux) Expires: Mon Jul 7 16:17:37 2008 Connection: close Transfer-Encoding: chunked Content-Type: text/plain; charset=UTF-8
"500 Command syntax error: incorrect arg count forhandshake. " 200 ((:DATE . "Mon, 07 Jul 2008 14:17:36 GMT") (:SERVER . "Apache/2.0.54 (Debian GNU/Linux)") (:EXPIRES . "Mon Jul 7 16:17:37 2008") (:CONNECTION . "close") (:TRANSFER-ENCODING . "chunked") (:CONTENT-TYPE . "text/plain; charset=UTF-8")) #<PURI:URI http://freedb.org/~cddb/cddb.cgi?cmd=cddb%2Blscat&hello=user%2Bhost%2Bfr... #<FLEXI-STREAMS:FLEXI-IO-STREAM {BA65021}> T "OK" * (drakma:http-request "http://freedb.org/~cddb/cddb.cgi?cmd=cddb+lscat&hello=user+host+freedb+1...") GET /~cddb/cddb.cgi?cmd=cddb+lscat&hello=user+host+freedb+1.0&proto=6 HTTP/1.1 Host: freedb.org User-Agent: Drakma/0.11.5 (SBCL 1.0.11.debian; Linux; 2.6.24-19-generic; http://weitz.de/drakma/) Accept: */* Connection: close
HTTP/1.1 200 OK Date: Mon, 07 Jul 2008 14:17:42 GMT Server: Apache/2.0.54 (Debian GNU/Linux) Expires: Mon Jul 7 16:17:42 2008 Connection: close Transfer-Encoding: chunked Content-Type: text/plain; charset=UTF-8
"210 OK, category list follows (until terminating `.') data folk jazz misc rock country blues newage reggae classical soundtrack . " 200 ((:DATE . "Mon, 07 Jul 2008 14:17:42 GMT") (:SERVER . "Apache/2.0.54 (Debian GNU/Linux)") (:EXPIRES . "Mon Jul 7 16:17:42 2008") (:CONNECTION . "close") (:TRANSFER-ENCODING . "chunked") (:CONTENT-TYPE . "text/plain; charset=UTF-8")) #<PURI:URI http://freedb.org/~cddb/cddb.cgi?cmd=cddb+lscat&hello=user+host+freedb+1... #<FLEXI-STREAMS:FLEXI-IO-STREAM {BAAA461}> T "OK" *
On Mon, 7 Jul 2008 07:28:13 -0700 (PDT), Eric Benson eric_a_benson@yahoo.com wrote:
It appears that drakma is encoding plus signs (+) in query parameters, turning them into %2B when they should be left alone.
According to 3.4 of RFC 2396 the character "+" is reserved in query components. Encoding plus signs in GET requests is also something Firefox and Internet Explorer do.
This confuses the server in this case.
Maybe the server is confused anyway?
Edi.