1 /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3 * Data Differential YATL (i.e. libtest) library
5 * Copyright (C) 2012 Data Differential, http://datadifferential.com/
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
14 * * Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following disclaimer
16 * in the documentation and/or other materials provided with the
19 * * The names of its contributors may not be used to endorse or
20 * promote products derived from this software without specific prior
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 #include <libtest/common.h>
41 #if defined(HAVE_CURL_CURL_H) && HAVE_CURL_CURL_H
42 #include <curl/curl.h>
48 static void cleanup_curl(void)
50 #if defined(HAVE_CURL_CURL_H) && HAVE_CURL_CURL_H
51 curl_global_cleanup();
55 static void initialize_curl_startup()
57 #if defined(HAVE_CURL_CURL_H) && HAVE_CURL_CURL_H
58 if (curl_global_init(CURL_GLOBAL_ALL
))
60 fatal_message("curl_global_init(CURL_GLOBAL_ALL) failed");
64 if (atexit(cleanup_curl
))
66 fatal_message("atexit() failed");
70 static pthread_once_t start_key_once
= PTHREAD_ONCE_INIT
;
71 void initialize_curl(void)
74 if ((ret
= pthread_once(&start_key_once
, initialize_curl_startup
)) != 0)
76 fatal_message(strerror(ret
));
83 #define YATL_USERAGENT "YATL/1.0"
86 http_get_result_callback(void *ptr
, size_t size
, size_t nmemb
, void *data
)
88 vchar_t
*_body
= (vchar_t
*)data
;
90 _body
->resize(size
* nmemb
);
91 memcpy(&_body
[0], ptr
, _body
->size());
97 static void init(CURL
*curl
, const std::string
& url
)
101 #if defined(HAVE_LIBCURL) && HAVE_LIBCURL
103 curl_easy_setopt(curl
, CURLOPT_URL
, url
.c_str());
104 curl_easy_setopt(curl
, CURLOPT_USERAGENT
, YATL_USERAGENT
);
109 HTTP::HTTP(const std::string
& url_arg
) :
122 #if defined(HAVE_LIBCURL) && HAVE_LIBCURL
123 CURL
*curl
= curl_easy_init();
127 curl_easy_setopt(curl
, CURLOPT_WRITEFUNCTION
, http_get_result_callback
);
128 curl_easy_setopt(curl
, CURLOPT_WRITEDATA
, (void *)&_body
);
130 CURLcode retref
= curl_easy_perform(curl
);
131 curl_easy_getinfo(curl
, CURLINFO_RESPONSE_CODE
, _response
);
133 curl_easy_cleanup(curl
);
135 return retref
== CURLE_OK
;
146 #if defined(HAVE_LIBCURL) && HAVE_LIBCURL
147 CURL
*curl
= curl_easy_init();;
151 curl_easy_setopt(curl
, CURLOPT_POSTFIELDSIZE
, _body
.size());
152 curl_easy_setopt(curl
, CURLOPT_POSTFIELDS
, (void *)&_body
[0]);
154 CURLcode retref
= curl_easy_perform(curl
);
155 curl_easy_getinfo(curl
, CURLINFO_RESPONSE_CODE
, _response
);
157 curl_easy_cleanup(curl
);
164 bool TRACE::execute()
168 #if defined(HAVE_LIBCURL) && HAVE_LIBCURL
169 CURL
*curl
= curl_easy_init();;
173 curl_easy_setopt(curl
, CURLOPT_CUSTOMREQUEST
, "TRACE");
174 curl_easy_setopt(curl
, CURLOPT_WRITEFUNCTION
, http_get_result_callback
);
175 curl_easy_setopt(curl
, CURLOPT_WRITEDATA
, (void *)&_body
[0]);
177 CURLcode retref
= curl_easy_perform(curl
);
178 curl_easy_getinfo(curl
, CURLINFO_RESPONSE_CODE
, _response
);
180 curl_easy_cleanup(curl
);
182 return retref
== CURLE_OK
;
193 #if defined(HAVE_LIBCURL) && HAVE_LIBCURL
194 CURL
*curl
= curl_easy_init();;
198 curl_easy_setopt(curl
, CURLOPT_CUSTOMREQUEST
, "HEAD");
199 curl_easy_setopt(curl
, CURLOPT_WRITEFUNCTION
, http_get_result_callback
);
201 CURLcode retref
= curl_easy_perform(curl
);
202 curl_easy_getinfo(curl
, CURLINFO_RESPONSE_CODE
, _response
);
204 curl_easy_cleanup(curl
);
206 return retref
== CURLE_OK
;
214 } // namespace libtest