[drakma-devel] https through a proxy
Bill St. Clair
wws at clozure.com
Wed May 5 02:41:17 UTC 2010
I have an application where I need to do https requests through a proxy
server. It hangs in Drakma 1.1.0. I found the fix, for Lispworks only,
at
http://www.mail-archive.com/drakma-devel@common-lisp.net/msg00200.html .
I guess Edi didn't integrate it yet. I made it work in CCL 1.5, meaning
it will probably work everywhere, but I did't test Allegro. My fix is a
little ugly, as I'm setting a slot with no writer inside of the chunga
stream, but it works for me. Patch below.
-Bill St. Clair
wws at clozure.com
====
diff -rN old-drakma/request.lisp new-drakma/request.lisp
429c429,430
< (let (http-stream must-close done)
---
> (let ((proxying-https? (and proxy (not stream) (eq :https
(puri:uri-scheme uri))))
> http-stream raw-http-stream must-close done)
437,438c438,440
< (use-ssl (or force-ssl
< (eq (uri-scheme uri) :https))))
---
> (use-ssl (and (not proxying-https?)
> (or force-ssl
> (eq (uri-scheme uri) :https)))))
470a473
> (setq raw-http-stream http-stream)
498a502,528
> (when proxying-https?
> ;; Setup a tunnel through the proxy server to the
> ;; final destination.
> (write-http-line "CONNECT ~A:~A
HTTP/1.1"(puri:uri-host uri)
> (or (puri:uri-port uri) 443))
> (write-http-line "Host: ~A:~A" (puri:uri-host uri)
> (or (puri:uri-port uri) 443))
> (write-http-line "")
> (force-output http-stream)
> ;; Check we get a 200 response before proceeding.
> (let ((line (read-status-line http-stream
*header-stream*)))
> (unless (eq (second line) 200)
> (error "Unable to establish HTTPS tunnel through
proxy.")))
> ;; Got a connection. We have to read a blank line,
> ;; turn on SSL, and then we can transmit.
> (read-line* http-stream)
> #+:lispworks
> (comm:attach-ssl raw-http-stream :ssl-side :client)
> #-lispworks
> (setf (slot-value (flexi-stream-stream http-stream)
'chunga::real-stream) ;evil
> #+:allegro
> (socket:make-ssl-client-stream raw-http-stream)
> #-:allegro
> (let ((s raw-http-stream))
> (cl+ssl:make-ssl-client-stream
> (cl+ssl:stream-fd s)
> :close-callback (lambda () (close s))))))
513c543
< (cond (proxy (render-uri uri nil))
---
> (cond ((and proxy (not
proxying-https?)) (render-uri uri nil))
More information about the Drakma-devel
mailing list