-rw-r--r-- | lib/consumer.cc | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/lib/consumer.cc b/lib/consumer.cc index c155157..62bec71 100644 --- a/lib/consumer.cc +++ b/lib/consumer.cc @@ -19,4 +19,23 @@ namespace opkele { using util::curl_t; + template<int lim> + class curl_fetch_string_t : public curl_t { + public: + curl_fetch_string_t(CURL *c) + : curl_t(c) { } + ~curl_fetch_string_t() throw() { } + + string response; + + size_t write(void *p,size_t size,size_t nmemb) { + size_t bytes = size*nmemb; + size_t get = min(lim-response.length(),bytes); + response.append((const char *)p,get); + return get; + } + }; + + typedef curl_fetch_string_t<16384> curl_pick_t; + class pcre_matches_t { public: @@ -63,12 +82,4 @@ namespace opkele { }; - static size_t _curl_tostring(void *ptr,size_t size,size_t nmemb,void *stream) { - string *str = (string*)stream; - size_t bytes = size*nmemb; - size_t get = min(16384-str->length(),bytes); - str->append((const char*)ptr,get); - return get; - } - assoc_t consumer_t::associate(const string& server) { util::dh_t dh = DH_new(); @@ -85,8 +96,7 @@ namespace opkele { "&openid.dh_consumer_public="; request += util::url_encode(util::bignum_to_base64(dh->pub_key)); - curl_t curl = curl_t::easy_init(); + curl_pick_t curl = curl_pick_t::easy_init(); if(!curl) throw exception_curl(OPKELE_CP_ "failed to initialize curl"); - string response; CURLcode r; (r=curl.misc_sets()) @@ -95,6 +105,5 @@ namespace opkele { || (r=curl.easy_setopt(CURLOPT_POSTFIELDS,request.data())) || (r=curl.easy_setopt(CURLOPT_POSTFIELDSIZE,request.length())) - || (r=curl.easy_setopt(CURLOPT_WRITEFUNCTION,_curl_tostring)) - || (r=curl.easy_setopt(CURLOPT_WRITEDATA,&response)) + || (r=curl.set_write()) ; if(r) @@ -102,5 +111,5 @@ namespace opkele { if( (r=curl.easy_perform()) ) throw exception_curl(OPKELE_CP_ "failed to perform curly request",r); - params_t p; p.parse_keyvalues(response); + params_t p; p.parse_keyvalues(curl.response); if(p.has_param("assoc_type") && p.get_param("assoc_type")!="HMAC-SHA1") throw bad_input(OPKELE_CP_ "unsupported assoc_type"); @@ -245,8 +254,7 @@ namespace opkele { } } - curl_t curl = curl_t::easy_init(); + curl_pick_t curl = curl_pick_t::easy_init(); if(!curl) throw exception_curl(OPKELE_CP_ "failed to initialize curl"); - string response; CURLcode r; (r=curl.misc_sets()) @@ -255,6 +263,5 @@ namespace opkele { || (r=curl.easy_setopt(CURLOPT_POSTFIELDS,request.data())) || (r=curl.easy_setopt(CURLOPT_POSTFIELDSIZE,request.length())) - || (r=curl.easy_setopt(CURLOPT_WRITEFUNCTION,_curl_tostring)) - || (r=curl.easy_setopt(CURLOPT_WRITEDATA,&response)) + || (r=curl.set_write()) ; if(r) @@ -262,5 +269,5 @@ namespace opkele { if( (r=curl.easy_perform()) ) throw exception_curl(OPKELE_CP_ "failed to perform curly request",r); - params_t pp; pp.parse_keyvalues(response); + params_t pp; pp.parse_keyvalues(curl.response); if(pp.has_param("invalidate_handle")) invalidate_assoc(server,pp.get_param("invalidate_handle")); @@ -278,13 +285,12 @@ namespace opkele { server.erase(); delegate.erase(); - curl_t curl = curl_t::easy_init(); + curl_pick_t curl = curl_pick_t::easy_init(); if(!curl) throw exception_curl(OPKELE_CP_ "failed to initialize curl"); - string html; + string& html = curl.response; CURLcode r; (r=curl.misc_sets()) || (r=curl.easy_setopt(CURLOPT_URL,url.c_str())) - || (r=curl.easy_setopt(CURLOPT_WRITEFUNCTION,_curl_tostring)) - || (r=curl.easy_setopt(CURLOPT_WRITEDATA,&html)) + || (r=curl.set_write()); ; if(r) |