Maybe I should just build the SSL logic into http-client.core/request and
have request instantiate a different DefaultHttpClient based on the value of
:noauth in the request map?

Will try when I get home.

John


On Thu, Sep 1, 2011 at 4:31 PM, John Newman <john...@gmail.com> wrote:

> Hello All,
>
> I am trying to add some functionality to http-client.  Basically, I need
> the ability to do get requests on a server while ignoring ssl errors.  Once
> I figure out how to get it working, I'll put it up on github and people can
> pull it if they'd like.
>
> I am working from a fork of http-client that has support for cookies,
> located here: https://github.com/r0man/clj-http/commits/cookies
>
> I used r0man's changes (
> https://github.com/r0man/clj-http/commit/f8152c6182c148539148fdc7f77faab14b7567c3)
> as an example of what I needed to change in order to add "ssl error ignore"
> capability.
>
> I used some java wisdom from stackoverflow (
> http://stackoverflow.com/questions/2012497/accepting-a-certificate-for-https-on-android/3904473#3904473)
> to ignore ssl errors.
>
> I came up with this:
>
> src/http-client/client.clj
>
> ...
>   (:use [clj-http.cookies :only (wrap-cookies)]
>         [clj-http.noauth :only (wrap-noauth)])))
> ...
> and
> ...
> (defn wrap-request
>   "Returns a battaries-included HTTP request function coresponding to the
> given
>    core client. See client/client."
>   [request]
>   (-> request
>     wrap-noauth
>     wrap-redirects
>     wrap-exceptions
> ...
>
> I put wrap-noauth (which might have been a bad name) at the beginning
> because it takes the old client and actually returns a new one:
>
> src/http-client/noauth.clj
>
> (ns clj-http.noauth
>   "Allows client to ignore some SSL errors (only use in dev!)"
>   (:import (javax.net.ssl HostnameVerifier HttpsURLConnection))
>   (:import (org.apache.http.conn.ssl SSLSocketFactory
> X509HostnameVerifier))
>   (:import (org.apache.http.conn.scheme Scheme SchemeRegistry))
>   (:import (org.apache.http.impl.client DefaultHttpClient))
>   (:import (org.apache.http.impl.conn SingleClientConnManager)))
>
> (defn wrap-noauth [client]
>   (fn [req]
>     (if (:noauth req)
>       (let [registry (SchemeRegistry.)
>             hostname-verifier SSLSocketFactory/ALLOW_ALL_HOSTNAME_VERIFIER
>             socket-factory (SSLSocketFactory/getSocketFactory)
>             _ (.setHostnameVerifier
>                 socket-factory hostname-verifier)
>             _ (.register registry (Scheme. "https" socket-factory 443))
>             noauth-client (DefaultHttpClient.
>                             (SingleClientConnManager. (.getParams client)
> registry)
>                             (.getParams client))
>             _ (HttpsURLConnection/setDefaultHostnameVerifier
> hostname-verifier)]
>         (noauth-client req))
>       (client req))))
> I essentially modeled wrap-noauth on the stackoverflow thread.
>
> When I run (c/get my-url {:noauth true :cookies ...
>
> I get:
>
> user=> IllegalArgumentException No matching field found: getParams for
> class clojure.lang.Var  clojure.lang.Reflector.getInstanceField
> (Reflector.java:289)
>
> Taking the ':noauth true' out of the argument map makes the error go away.
>
> The only place I see getParams used is towards the beginning of the request
> function in core.clj
>
> src/http-client/core.clj
> ...
>   (let [http-client (DefaultHttpClient.)]
>     (try
>       (-> http-client
>         (.getParams)
>         (.setParameter ClientPNames/COOKIE_POLICY
> CookiePolicy/BROWSER_COMPATIBILITY))
>       (let [http-url (str scheme "://" server-name
> ...
>
> I'm still not sure what is going on... Am I breaking it by instantiating a
> new DefaultHttpClient?  Should a new key for noauth be put in the parameters
> to core/request [{:keys [noauth...  the cookies branch didn't do this, so I
> wasn't sure.
>
> Thanks in advance for the help.  Hopefully, once this is figured out, it
> will be useful to others as well.
>
> John
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to