Hi,
First of all, thank you Edi Weitz for your excellent libraries. I find them simple to use, well thought out, and with excellent documentation. Again, a big thank you. And thanks to whoever is working on porting Drakma.
I found a couple of problems:
Drakma cannot receive cookies from localhost. After a short investigation I found that the problem was with the method VALID-COOKIE-DOMAIN-P, which insist to have at least 2 dots in the normalized domain name. As a workaround I used 127.0.0.1 instead of localhost.
The other problem is with an incomplete implementation of flexi-streams under CMUCL. The call:
(drakma:http-request "http://www.google.com/" :parameters '(("q" . "something")))
works normally, but
(drakma:http-request "http://www.google.com/search" :parameters '(("q" . "something")))
gives:
No matching method for the generic function #<STANDARD-GENERIC-FUNCTION INPUT-STREAM-P (2) {58E17501}>, when called with arguments (#<FLEXI-STREAMS::VECTOR-OUTPUT-STREAM {5834F8FD}>). [Condition of type PCL::NO-APPLICABLE-METHOD-ERROR]
0: ("DEFMETHOD NO-APPLICABLE-METHOD (T)" #<#1=unused-arg> #<#1#> #<STANDARD-GENERIC-FUNCTION INPUT-STREAM-P (2) {58E17501}> (#<FLEXI-STREAMS::VECTOR-OUTPUT-STREAM {5834F8FD}>)) 1: (FLEXI-STREAMS:MAKE-FLEXI-STREAM #<FLEXI-STREAMS::VECTOR-OUTPUT-STREAM {5834F8FD}> :EXTERNAL-FORMAT :LATIN-1) 2: (FLEXI-STREAMS:STRING-TO-OCTETS "q" :EXTERNAL-FORMAT :LATIN-1 :START ...) 3: (DRAKMA::URL-ENCODE "q" :LATIN-1) 4: (DRAKMA::ALIST-TO-URL-ENCODED-STRING (("q" . "something")) :LATIN-1) 5: (DRAKMA:HTTP-REQUEST #<URI http://www.google.com/search%3E :PARAMETERS (("q" . "something")))
I don't have time at the moment to see if anything else is missing and to give patches. For this case though the workaround seems to be as simple as:
(defmethod input-stream-p ((s flexi-streams::vector-output-stream)) nil)
Cheers, Ivan
P.S. I did a clean ASDF-install on Drakma and it's dependencies. I can give the precise versions if needed.
Hi!
On Sun, 24 Sep 2006 09:41:04 +0300, "Ivan Toshkov" ivan@toshkov.org wrote:
First of all, thank you Edi Weitz for your excellent libraries. I find them simple to use, well thought out, and with excellent documentation. Again, a big thank you.
You're welcome... :)
And thanks to whoever is working on porting Drakma.
I think that's me... :)
I found a couple of problems:
Drakma cannot receive cookies from localhost. After a short investigation I found that the problem was with the method VALID-COOKIE-DOMAIN-P, which insist to have at least 2 dots in the normalized domain name. As a workaround I used 127.0.0.1 instead of localhost.
Thanks for the report, I've released a new version (0.4.4) which fixes this.
The other problem is with an incomplete implementation of flexi-streams under CMUCL. The call:
(drakma:http-request "http://www.google.com/" :parameters '(("q" . "something")))
works normally, but
(drakma:http-request "http://www.google.com/search" :parameters '(("q" . "something")))
gives:
No matching method for the generic function #<STANDARD-GENERIC-FUNCTION INPUT-STREAM-P (2) {58E17501}>, when called with arguments (#<FLEXI-STREAMS::VECTOR-OUTPUT-STREAM {5834F8FD}>). [Condition of type PCL::NO-APPLICABLE-METHOD-ERROR]
0: ("DEFMETHOD NO-APPLICABLE-METHOD (T)" #<#1=unused-arg> #<#1#> #<STANDARD-GENERIC-FUNCTION INPUT-STREAM-P (2) {58E17501}> (#<FLEXI-STREAMS::VECTOR-OUTPUT-STREAM {5834F8FD}>)) 1: (FLEXI-STREAMS:MAKE-FLEXI-STREAM #<FLEXI-STREAMS::VECTOR-OUTPUT-STREAM {5834F8FD}> :EXTERNAL-FORMAT :LATIN-1) 2: (FLEXI-STREAMS:STRING-TO-OCTETS "q" :EXTERNAL-FORMAT :LATIN-1 :START ...) 3: (DRAKMA::URL-ENCODE "q" :LATIN-1) 4: (DRAKMA::ALIST-TO-URL-ENCODED-STRING (("q" . "something")) :LATIN-1) 5: (DRAKMA:HTTP-REQUEST #<URI http://www.google.com/search%3E :PARAMETERS (("q" . "something")))
I don't have time at the moment to see if anything else is missing and to give patches. For this case though the workaround seems to be as simple as:
(defmethod input-stream-p ((s flexi-streams::vector-output-stream)) nil)
If I understand the Gray streams proposal correctly, this isn't an incompleteness in FLEXI-STREAMS, but a problem in CMUCL's Gray streams implementation. Are you using the newest version of CMUCL? Have you asked on their mailing list? (It is also not clear to me why the problem only surfaces with the longer URL because URL-ENCODE has to be called in both cases.)
Cheers, Edi.
On 9/24/06, Edi Weitz edi@agharta.de wrote:
Hi!
On Sun, 24 Sep 2006 09:41:04 +0300, "Ivan Toshkov" ivan@toshkov.org wrote:
First of all, thank you Edi Weitz for your excellent libraries. I find them simple to use, well thought out, and with excellent documentation. Again, a big thank you.
You're welcome... :)
And thanks to whoever is working on porting Drakma.
I think that's me... :)
Right. I was under the wrong impression that the port was done by Zach Beane, because I read about it on his blog.
I found a couple of problems:
Drakma cannot receive cookies from localhost. After a short investigation I found that the problem was with the method VALID-COOKIE-DOMAIN-P, which insist to have at least 2 dots in the normalized domain name. As a workaround I used 127.0.0.1 instead of localhost.
Thanks for the report, I've released a new version (0.4.4) which fixes this.
Great. And I already have another one. The funcall
(drakma:http-request "http://www.openrdf.org/sesame/servlets/listRepositories")
returns:
NIL 200 ((:CACHE-CONTROL . "no-cache") (:EXPIRES . "0") (:PRAGMA . "no-cache") (:CONTENT-TYPE . "text/xml") (:DATE . "Sun, 24 Sep 2006 21:52:34 GMT") (:SERVER . "Apache-Coyote/1.1") (:CONNECTION . "close")) #<URI http://www.openrdf.org/sesame/servlets/listRepositories%3E #<FLEXI-STREAMS:FLEXI-IO-STREAM {B579D01}> T
while the browser shows a small XML. I traced the problem to the READ-BODY function, which assumes (perhaps rightly so) that if the content length header is missing the stream must be a chunked stream. In this case it's not and so READ-BODY returns NIL.
(please check my excuse for not providing any patches at the bottom of this email.)
The other problem is with an incomplete implementation of flexi-streams under CMUCL. The call:
(drakma:http-request "http://www.google.com/" :parameters '(("q" . "something")))
works normally, but
(drakma:http-request "http://www.google.com/search" :parameters '(("q" . "something")))
gives:
No matching method for the generic function #<STANDARD-GENERIC-FUNCTION INPUT-STREAM-P (2) {58E17501}>, when called with arguments (#<FLEXI-STREAMS::VECTOR-OUTPUT-STREAM {5834F8FD}>). [Condition of type PCL::NO-APPLICABLE-METHOD-ERROR]
0: ("DEFMETHOD NO-APPLICABLE-METHOD (T)" #<#1=unused-arg> #<#1#> #<STANDARD-GENERIC-FUNCTION INPUT-STREAM-P (2) {58E17501}> (#<FLEXI-STREAMS::VECTOR-OUTPUT-STREAM {5834F8FD}>)) 1: (FLEXI-STREAMS:MAKE-FLEXI-STREAM #<FLEXI-STREAMS::VECTOR-OUTPUT-STREAM {5834F8FD}> :EXTERNAL-FORMAT :LATIN-1) 2: (FLEXI-STREAMS:STRING-TO-OCTETS "q" :EXTERNAL-FORMAT :LATIN-1 :START ...) 3: (DRAKMA::URL-ENCODE "q" :LATIN-1) 4: (DRAKMA::ALIST-TO-URL-ENCODED-STRING (("q" . "something")) :LATIN-1) 5: (DRAKMA:HTTP-REQUEST #<URI http://www.google.com/search%3E :PARAMETERS (("q" . "something")))
I don't have time at the moment to see if anything else is missing and to give patches. For this case though the workaround seems to be as simple as:
(defmethod input-stream-p ((s flexi-streams::vector-output-stream)) nil)
If I understand the Gray streams proposal correctly, this isn't an incompleteness in FLEXI-STREAMS, but a problem in CMUCL's Gray streams implementation. Are you using the newest version of CMUCL?
CMUCL 19c.
Have you asked on their mailing list?
I haven't. Please check the excuse again :)
(It is also not clear to me why the problem only surfaces with the longer URL because URL-ENCODE has to be called in both cases.)
I thought it was caused by the :parameters keyword, but I actually haven't looked at the code.
Cheers, Edi.
EXCUSE: I have to make this legacy Lisp app to talk to a Java web app and I have to do it by Tuesday for a demo. So I don't have the time to do "the right thing" right now and I'm doing the minimal fixes required.
Cheers, Ivan
On Mon, 25 Sep 2006 01:12:35 +0300, "Ivan Toshkov" ivan@toshkov.org wrote:
Great. And I already have another one. The funcall
(drakma:http-request "http://www.openrdf.org/sesame/servlets/listRepositories")
returns:
NIL 200 ((:CACHE-CONTROL . "no-cache") (:EXPIRES . "0") (:PRAGMA . "no-cache") (:CONTENT-TYPE . "text/xml") (:DATE . "Sun, 24 Sep 2006 21:52:34 GMT") (:SERVER . "Apache-Coyote/1.1") (:CONNECTION . "close")) #<URI http://www.openrdf.org/sesame/servlets/listRepositories%3E #<FLEXI-STREAMS:FLEXI-IO-STREAM {B579D01}> T
while the browser shows a small XML. I traced the problem to the READ-BODY function, which assumes (perhaps rightly so) that if the content length header is missing the stream must be a chunked stream. In this case it's not and so READ-BODY returns NIL.
Yeah, that's a mistake due to a thinko of mine which must have crept in around version 0.4.0. Should be fixed in 0.5.0 which was just released. Thanks for catching that.
Have you asked on their mailing list?
I haven't. Please check the excuse again :)
OK, once you have more time you should probably ask there. If it's really an oversight in CMUCL, it should be fixed there and not in FLEXI-STREAMS.
EXCUSE: I have to make this legacy Lisp app to talk to a Java web app and I have to do it by Tuesday for a demo. So I don't have the time to do "the right thing" right now and I'm doing the minimal fixes required.
No problem. Good luck with the demo!
Cheers, Edi.