author | Michael Krelin <hacker@klever.net> | 2008-03-07 19:45:26 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2008-03-07 19:45:26 (UTC) |
commit | 0d19bbaa23b7bd07ec4f5e3683ffdd8df4641bc9 (patch) (side-by-side diff) | |
tree | 589401b7985fc8b6c9afeafe48a19569d65dcc4c | |
parent | f56409b28ff418a5317743ad01821609881cd664 (diff) | |
download | libopkele-0d19bbaa23b7bd07ec4f5e3683ffdd8df4641bc9.zip libopkele-0d19bbaa23b7bd07ec4f5e3683ffdd8df4641bc9.tar.gz libopkele-0d19bbaa23b7bd07ec4f5e3683ffdd8df4641bc9.tar.bz2 |
added a helper to prepare curl request based on http_request_t
* added curl_slist to http_request_t structure
* added http_request_t::setup_curl(CURL*)
Signed-off-by: Michael Krelin <hacker@klever.net>
-rw-r--r-- | include/opkele/oauth/consumer.h | 5 | ||||
-rw-r--r-- | lib/oauth-consumer.cc | 28 |
2 files changed, 33 insertions, 0 deletions
diff --git a/include/opkele/oauth/consumer.h b/include/opkele/oauth/consumer.h index 1e2784c..9196297 100644 --- a/include/opkele/oauth/consumer.h +++ b/include/opkele/oauth/consumer.h @@ -1,22 +1,23 @@ #ifndef __OPKELE_OAUTH_CONSUMER_H #define __OPKELE_OAUTH_CONSUMER_H #include <string> #include <opkele/types.h> #include <opkele/oauth.h> +#include <opkele/curl.h> namespace opkele { namespace oauth { using std::string; enum oauth_method_t { oauth_auth_header, oauth_post_body, oauth_url_query }; struct service_endpoint_t { string url; string signature_method; oauth_method_t oauth_method; service_endpoint_t(const string& u,const string& sm,oauth_method_t om) : url(u), signature_method(sm), oauth_method(om) { } @@ -28,34 +29,38 @@ namespace opkele { virtual ~basic_provider_endpoints() { } virtual const service_endpoint_t& get_request_token_endpoint() const = 0; virtual const service_endpoint_t& get_authorize_user_endpoint() const = 0; virtual const service_endpoint_t& get_access_token_endpoint() const = 0; virtual service_endpoint_t& get_url_endpoint(service_endpoint_t& sep, const string& url) const = 0; }; struct http_request_t { string authorize_header; string method; string url; string body; + util::curl_slist_t _curl_headers_list; + http_request_t(const string& m,const string& u) : method(m), url(u) { } + + void setup_curl(CURL *curl); }; class basic_consumer { public: token_t consumer_token; basic_consumer(const token_t& ct) : consumer_token(ct) { } virtual ~basic_consumer() { } virtual const basic_provider_endpoints& get_endpoints() const = 0; virtual const string allocate_nonce(time_t ts) = 0; token_t get_request_token(); const string get_authorize_url(const token_t& rt,const string& callback=""); token_t get_access_token(const token_t& rt); diff --git a/lib/oauth-consumer.cc b/lib/oauth-consumer.cc index d717ed3..0c4c9e3 100644 --- a/lib/oauth-consumer.cc +++ b/lib/oauth-consumer.cc @@ -209,32 +209,60 @@ namespace opkele { }else throw opkele::exception(OPKELE_CP_ /* TODO: specialize */ "Unknown oauth method"); } void basic_consumer::prepare_request( http_request_t& req, const basic_fields& qf,const basic_fields& pf, const service_endpoint_t& sep, const token_t *t,const string& realm) { prepare_request( req, qf, pf, sep.oauth_method,sep.signature_method, t,realm); } + void http_request_t::setup_curl(CURL *curl) { + CURLcode r; + r = curl_easy_setopt(curl,CURLOPT_URL,url.c_str()); + if(r) + throw exception_curl(OPKELE_CP_ "failed to set curly urlie",r); + if(method=="POST") { + (r = curl_easy_setopt(curl,CURLOPT_POST,1)) + || (r = curl_easy_setopt(curl,CURLOPT_POSTFIELDS,body.c_str())) + || (r = curl_easy_setopt(curl,CURLOPT_POSTFIELDSIZE,body.size())); + }else if(method=="GET") { + r = curl_easy_setopt(curl,CURLOPT_HTTPGET,1); + }else if(method=="HEAD") { + r = curl_easy_setopt(curl,CURLOPT_NOBODY,1); + }else /* TODO: specialize exception */ + throw exception(OPKELE_CP_ "don't know how to handle http method"); + if(r) + throw exception_curl(OPKELE_CP_ "failed to set curly options",r); + if(!authorize_header.empty()) { + r = curl_easy_setopt(curl,CURLOPT_HTTPHEADER,(curl_slist*)( + _curl_headers_list = curl_slist_append( + 0,string("Authorization: "+authorize_header).c_str() + ) + ) ); + if(r) + throw exception_curl(OPKELE_CP_ "failed to setup curlie header"); + } + } + const basic_provider_endpoints& simple_consumer::get_endpoints() const { return peps; } const string simple_consumer::allocate_nonce(time_t ts) { # ifndef HAVE_LIBUUID throw opkele::not_implemented(OPKELE_CP_ "not implemented consumer's allocate_nonce()"); # else /* HAVE_LIBUUID */ uuid_t uuid; uuid_generate(uuid); return util::encode_base64(uuid,sizeof(uuid)); # endif /* HAVE_LIBUUID */ } } } |