summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--include/opkele/curl.h20
-rw-r--r--lib/curl.cc20
2 files changed, 40 insertions, 0 deletions
diff --git a/include/opkele/curl.h b/include/opkele/curl.h
index 5cf8e48..bcaf11d 100644
--- a/include/opkele/curl.h
+++ b/include/opkele/curl.h
@@ -1,72 +1,92 @@
1#ifndef __OPKELE_CURL_H 1#ifndef __OPKELE_CURL_H
2#define __OPKELE_CURL_H 2#define __OPKELE_CURL_H
3 3
4#include <cassert> 4#include <cassert>
5#include <string> 5#include <string>
6#include <algorithm> 6#include <algorithm>
7#include <curl/curl.h> 7#include <curl/curl.h>
8 8
9namespace opkele { 9namespace opkele {
10 using std::min; 10 using std::min;
11 using std::string; 11 using std::string;
12 12
13 namespace util { 13 namespace util {
14 14
15 class curl_slist_t {
16 public:
17 curl_slist *_s;
18
19 curl_slist_t() : _s(0) { }
20 curl_slist_t(curl_slist *s) : _s(s) { }
21 virtual ~curl_slist_t() throw();
22
23 curl_slist_t& operator=(curl_slist *s);
24
25 operator const curl_slist*(void) const { return _s; }
26 operator curl_slist*(void) { return _s; }
27
28 void append(const char *str);
29 void append(const string& str) {
30 append(str.c_str()); }
31 };
32
15 class curl_t { 33 class curl_t {
16 public: 34 public:
17 CURL *_c; 35 CURL *_c;
18 36
19 curl_t() : _c(0) { } 37 curl_t() : _c(0) { }
20 curl_t(CURL *c) : _c(c) { } 38 curl_t(CURL *c) : _c(c) { }
21 virtual ~curl_t() throw(); 39 virtual ~curl_t() throw();
22 40
23 curl_t& operator=(CURL *c); 41 curl_t& operator=(CURL *c);
24 42
25 operator const CURL*(void) const { return _c; } 43 operator const CURL*(void) const { return _c; }
26 operator CURL*(void) { return _c; } 44 operator CURL*(void) { return _c; }
27 45
28 CURLcode misc_sets(); 46 CURLcode misc_sets();
29 47
30 template<typename PT> 48 template<typename PT>
31 inline CURLcode easy_setopt(CURLoption o,PT p) { assert(_c); return curl_easy_setopt(_c,o,p); } 49 inline CURLcode easy_setopt(CURLoption o,PT p) { assert(_c); return curl_easy_setopt(_c,o,p); }
50 inline CURLcode easy_setopt(CURLoption o,const curl_slist_t& p) {
51 assert(_c); return curl_easy_setopt(_c,o,(const curl_slist*)p); }
32 CURLcode easy_perform() { assert(_c); return curl_easy_perform(_c); } 52 CURLcode easy_perform() { assert(_c); return curl_easy_perform(_c); }
33 template<typename IT> 53 template<typename IT>
34 inline CURLcode easy_getinfo(CURLINFO i,IT p) { assert(_c); return curl_easy_getinfo(_c,i,p); } 54 inline CURLcode easy_getinfo(CURLINFO i,IT p) { assert(_c); return curl_easy_getinfo(_c,i,p); }
35 55
36 static inline CURL *easy_init() { return curl_easy_init(); } 56 static inline CURL *easy_init() { return curl_easy_init(); }
37 57
38 virtual size_t write(void* /* p */,size_t /* s */,size_t /* nm */) { return 0; } 58 virtual size_t write(void* /* p */,size_t /* s */,size_t /* nm */) { return 0; }
39 CURLcode set_write(); 59 CURLcode set_write();
40 60
41 virtual int progress(double /* dlt */,double /* dln*/ ,double /* ult */,double /* uln */) { return 0; } 61 virtual int progress(double /* dlt */,double /* dln*/ ,double /* ult */,double /* uln */) { return 0; }
42 CURLcode set_progress(); 62 CURLcode set_progress();
43 63
44 virtual size_t header(void* /* p */,size_t s,size_t nm) { return s*nm; } 64 virtual size_t header(void* /* p */,size_t s,size_t nm) { return s*nm; }
45 CURLcode set_header(); 65 CURLcode set_header();
46 }; 66 };
47 67
48 template<int lim> 68 template<int lim>
49 class curl_fetch_string_t : public curl_t { 69 class curl_fetch_string_t : public curl_t {
50 public: 70 public:
51 curl_fetch_string_t(CURL *c) 71 curl_fetch_string_t(CURL *c)
52 : curl_t(c) { } 72 : curl_t(c) { }
53 ~curl_fetch_string_t() throw() { } 73 ~curl_fetch_string_t() throw() { }
54 74
55 string response; 75 string response;
56 76
57 size_t write(void *p,size_t size,size_t nmemb) { 77 size_t write(void *p,size_t size,size_t nmemb) {
58 size_t bytes = size*nmemb; 78 size_t bytes = size*nmemb;
59 size_t get = min(lim-response.length(),bytes); 79 size_t get = min(lim-response.length(),bytes);
60 response.append((const char *)p,get); 80 response.append((const char *)p,get);
61 return get; 81 return get;
62 } 82 }
63 }; 83 };
64 84
65 typedef curl_fetch_string_t<16384> curl_pick_t; 85 typedef curl_fetch_string_t<16384> curl_pick_t;
66 86
67 87
68 } 88 }
69 89
70} 90}
71 91
72#endif /* __OPKELE_CURL_H */ 92#endif /* __OPKELE_CURL_H */
diff --git a/lib/curl.cc b/lib/curl.cc
index 6172828..734e2ca 100644
--- a/lib/curl.cc
+++ b/lib/curl.cc
@@ -1,56 +1,76 @@
1#include <opkele/exception.h>
1#include <opkele/curl.h> 2#include <opkele/curl.h>
2 3
3#include "config.h" 4#include "config.h"
4 5
5namespace opkele { 6namespace opkele {
6 7
7 namespace util { 8 namespace util {
8 9
10 curl_slist_t::~curl_slist_t() throw() {
11 if(_s)
12 curl_slist_free_all(_s);
13 }
14
15 curl_slist_t& curl_slist_t::operator=(curl_slist *s) {
16 if(_s)
17 curl_slist_free_all(_s);
18 _s = s;
19 return *this;
20 }
21
22 void curl_slist_t::append(const char *str) {
23 curl_slist *s = curl_slist_append(_s,str);
24 if(!s)
25 throw opkele::exception(OPKELE_CP_ "failed to curl_slist_append()");
26 _s=s;
27 }
28
9 curl_t::~curl_t() throw() { 29 curl_t::~curl_t() throw() {
10 if(_c) 30 if(_c)
11 curl_easy_cleanup(_c); 31 curl_easy_cleanup(_c);
12 } 32 }
13 33
14 curl_t& curl_t::operator=(CURL *c) { 34 curl_t& curl_t::operator=(CURL *c) {
15 if(_c) 35 if(_c)
16 curl_easy_cleanup(_c); 36 curl_easy_cleanup(_c);
17 _c = c; 37 _c = c;
18 return *this; 38 return *this;
19 } 39 }
20 40
21 CURLcode curl_t::misc_sets() { 41 CURLcode curl_t::misc_sets() {
22 assert(_c); 42 assert(_c);
23 CURLcode r; 43 CURLcode r;
24 (r=easy_setopt(CURLOPT_FOLLOWLOCATION,1)) 44 (r=easy_setopt(CURLOPT_FOLLOWLOCATION,1))
25 || (r=easy_setopt(CURLOPT_MAXREDIRS,5)) 45 || (r=easy_setopt(CURLOPT_MAXREDIRS,5))
26 || (r=easy_setopt(CURLOPT_DNS_CACHE_TIMEOUT,120)) 46 || (r=easy_setopt(CURLOPT_DNS_CACHE_TIMEOUT,120))
27 || (r=easy_setopt(CURLOPT_DNS_USE_GLOBAL_CACHE,1)) 47 || (r=easy_setopt(CURLOPT_DNS_USE_GLOBAL_CACHE,1))
28 || (r=easy_setopt(CURLOPT_USERAGENT,PACKAGE_NAME"/"PACKAGE_SRC_VERSION)) 48 || (r=easy_setopt(CURLOPT_USERAGENT,PACKAGE_NAME"/"PACKAGE_SRC_VERSION))
29 || (r=easy_setopt(CURLOPT_TIMEOUT,20)) 49 || (r=easy_setopt(CURLOPT_TIMEOUT,20))
30 #ifdefDISABLE_CURL_SSL_VERIFYHOST 50 #ifdefDISABLE_CURL_SSL_VERIFYHOST
31 || (r=easy_setopt(CURLOPT_SSL_VERIFYHOST,0)) 51 || (r=easy_setopt(CURLOPT_SSL_VERIFYHOST,0))
32#endif 52#endif
33 #ifdefDISABLE_CURL_SSL_VERIFYPEER 53 #ifdefDISABLE_CURL_SSL_VERIFYPEER
34 || (r=easy_setopt(CURLOPT_SSL_VERIFYPEER,0)) 54 || (r=easy_setopt(CURLOPT_SSL_VERIFYPEER,0))
35#endif 55#endif
36 ; 56 ;
37 return r; 57 return r;
38 } 58 }
39 59
40 static size_t _write(void *p,size_t s,size_t nm,void *stream) { 60 static size_t _write(void *p,size_t s,size_t nm,void *stream) {
41 return ((curl_t*)stream)->write(p,s,nm); 61 return ((curl_t*)stream)->write(p,s,nm);
42 } 62 }
43 63
44 CURLcode curl_t::set_write() { 64 CURLcode curl_t::set_write() {
45 assert(_c); 65 assert(_c);
46 CURLcode r; 66 CURLcode r;
47 (r = easy_setopt(CURLOPT_WRITEDATA,this)) 67 (r = easy_setopt(CURLOPT_WRITEDATA,this))
48 || (r = easy_setopt(CURLOPT_WRITEFUNCTION,_write)); 68 || (r = easy_setopt(CURLOPT_WRITEFUNCTION,_write));
49 return r; 69 return r;
50 } 70 }
51 71
52 static int _progress(void *cp,double dlt,double dln,double ult,double uln) { 72 static int _progress(void *cp,double dlt,double dln,double ult,double uln) {
53 return ((curl_t*)cp)->progress(dlt,dln,ult,uln); 73 return ((curl_t*)cp)->progress(dlt,dln,ult,uln);
54 } 74 }
55 75
56 CURLcode curl_t::set_progress() { 76 CURLcode curl_t::set_progress() {