kill evhttp_*
[hiphop-php.git] / hphp / test / ext / test_ext_curl.cpp
blobb676e704e9a56e73dfc2347eafcd0999afc91295
1 /*
2 +----------------------------------------------------------------------+
3 | HipHop for PHP |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 2010-2014 Facebook, Inc. (http://www.facebook.com) |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 3.01 of the PHP license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.php.net/license/3_01.txt |
11 | If you did not receive a copy of the PHP license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@php.net so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
17 #include "hphp/test/ext/test_ext_curl.h"
18 #include "hphp/runtime/ext/curl/ext_curl.h"
19 #include "hphp/runtime/ext/ext_output.h"
20 #include "hphp/runtime/ext/zlib/ext_zlib.h"
21 #include "hphp/runtime/server/libevent-server.h"
23 #define PORT_MIN 7100
24 #define PORT_MAX 7120
26 ///////////////////////////////////////////////////////////////////////////////
28 class TestCurlRequestHandler : public RequestHandler {
29 public:
30 explicit TestCurlRequestHandler(int timeout) : RequestHandler(timeout) {}
31 // implementing RequestHandler
32 virtual void handleRequest(Transport *transport) {
33 transport->addHeader("ECHOED", transport->getHeader("ECHO").c_str());
35 if (transport->getMethod() == Transport::Method::POST) {
36 int len = 0;
37 const void *data = transport->getPostData(len);
38 String res = "POST: ";
39 res += String((char*)data, len, CopyString);
40 transport->sendString(res.c_str());
41 } else {
42 transport->sendString("OK");
45 virtual void abortRequest(Transport *transport) {
46 transport->sendString("Aborted");
50 static int s_server_port = 0;
52 static std::string get_request_uri() {
53 return "http://localhost:" + boost::lexical_cast<string>(s_server_port) +
54 "/request";
57 static ServerPtr runServer() {
58 for (s_server_port = PORT_MIN; s_server_port <= PORT_MAX; s_server_port++) {
59 try {
60 ServerPtr server = folly::make_unique<LibEventServer>(
61 "127.0.0.1", s_server_port, 4);
62 server->setRequestHandlerFactory<TestCurlRequestHandler>(0);
63 server->start();
64 return std::move(server);
66 } catch (const FailedToListenException& e) {
67 if (s_server_port == PORT_MAX) throw;
70 return std::move(ServerPtr());
73 ///////////////////////////////////////////////////////////////////////////////
75 bool TestExtCurl::RunTests(const std::string &which) {
76 bool ret = true;
78 DECLARE_TEST_FUNCTIONS("function curl_write_func($s1, $s2) {"
79 " print 'curl_write_func called with ';"
80 " print $s2;"
81 " return strlen($s2);"
82 "}");
84 ServerPtr server = std::move(runServer());
86 RUN_TEST(test_curl_init);
87 RUN_TEST(test_curl_copy_handle);
88 RUN_TEST(test_curl_version);
89 RUN_TEST(test_curl_setopt);
90 RUN_TEST(test_curl_setopt_array);
91 RUN_TEST(test_curl_exec);
92 RUN_TEST(test_curl_getinfo);
93 RUN_TEST(test_curl_errno);
94 RUN_TEST(test_curl_error);
95 RUN_TEST(test_curl_close);
96 RUN_TEST(test_curl_multi_init);
97 RUN_TEST(test_curl_multi_add_handle);
98 RUN_TEST(test_curl_multi_remove_handle);
99 RUN_TEST(test_curl_multi_exec);
100 RUN_TEST(test_curl_multi_select);
101 RUN_TEST(test_curl_multi_getcontent);
102 RUN_TEST(test_curl_multi_info_read);
103 RUN_TEST(test_curl_multi_close);
105 server->stop();
107 return ret;
110 ///////////////////////////////////////////////////////////////////////////////
112 bool TestExtCurl::test_curl_init() {
113 Variant c = HHVM_FN(curl_init)();
114 VS(HHVM_FN(curl_errno)(c.toResource()), 0);
115 VS(HHVM_FN(curl_error)(c.toResource()), "");
116 return Count(true);
119 const StaticString s_OK("OK");
121 bool TestExtCurl::test_curl_copy_handle() {
122 Variant c = HHVM_FN(curl_init)();
123 HHVM_FN(curl_setopt)(c.toResource(), k_CURLOPT_URL,
124 String(get_request_uri()));
125 HHVM_FN(curl_setopt)(c.toResource(), k_CURLOPT_RETURNTRANSFER, true);
126 Variant cpy = HHVM_FN(curl_copy_handle)(c.toResource());
127 HHVM_FN(curl_close)(c.toResource()); // to test cpy is still working fine
128 Variant res = HHVM_FN(curl_exec)(cpy.toResource());
129 if (res.toString() != s_OK) {
130 // XXX: t1782098
131 return CountSkip();
133 return Count(true);
136 static const StaticString
137 s_protocols("protocols"),
138 s_url("url"),
139 s_result("result"),
140 s_code("code"),
141 s_response("response"),
142 s_headers("headers");
144 bool TestExtCurl::test_curl_version() {
145 Variant ret = HHVM_FN(curl_version)();
146 VERIFY(!ret[s_protocols].toArray().empty());
147 return Count(true);
150 bool TestExtCurl::test_curl_setopt() {
151 Variant c = HHVM_FN(curl_init)();
152 HHVM_FN(curl_setopt)(c.toResource(), k_CURLOPT_URL,
153 String(get_request_uri()));
154 HHVM_FN(curl_setopt)(c.toResource(), k_CURLOPT_RETURNTRANSFER, true);
155 Variant res = HHVM_FN(curl_exec)(c.toResource());
156 VS(res, "OK");
157 return Count(true);
160 bool TestExtCurl::test_curl_setopt_array() {
161 Variant c = HHVM_FN(curl_init)();
162 HHVM_FN(curl_setopt_array)
163 (c.toResource(),
164 make_map_array(k_CURLOPT_URL, String(get_request_uri()),
165 k_CURLOPT_RETURNTRANSFER, true));
166 Variant res = HHVM_FN(curl_exec)(c.toResource());
167 VS(res, "OK");
168 return Count(true);
171 bool TestExtCurl::test_curl_exec() {
173 Variant c = HHVM_FN(curl_init)(String(get_request_uri()));
174 HHVM_FN(curl_setopt)(c.toResource(), k_CURLOPT_RETURNTRANSFER, true);
175 Variant res = HHVM_FN(curl_exec)(c.toResource());
176 VS(res, "OK");
179 Variant c = HHVM_FN(curl_init)(String(get_request_uri()));
180 HHVM_FN(curl_setopt)(c.toResource(), k_CURLOPT_WRITEFUNCTION,
181 "curl_write_func");
182 f_ob_start();
183 HHVM_FN(curl_exec)(c.toResource());
184 String res = f_ob_get_contents();
185 VS(res, "curl_write_func called with OK");
186 f_ob_end_clean();
188 return Count(true);
191 bool TestExtCurl::test_curl_getinfo() {
192 Variant c = HHVM_FN(curl_init)(String(get_request_uri()));
193 HHVM_FN(curl_setopt)(c.toResource(), k_CURLOPT_RETURNTRANSFER, true);
194 HHVM_FN(curl_exec)(c.toResource());
195 Variant ret = HHVM_FN(curl_getinfo)(c.toResource());
196 VS(ret[s_url], String(get_request_uri()));
197 ret = HHVM_FN(curl_getinfo)(c.toResource(), k_CURLINFO_EFFECTIVE_URL);
198 VS(ret, String(get_request_uri()));
199 return Count(true);
202 bool TestExtCurl::test_curl_errno() {
203 Variant c = HHVM_FN(curl_init)("http://www.thereisnosuchanurl");
204 HHVM_FN(curl_setopt)(c.toResource(), k_CURLOPT_RETURNTRANSFER, true);
205 HHVM_FN(curl_exec)(c.toResource());
206 Variant err = HHVM_FN(curl_errno)(c.toResource());
207 VS(err, k_CURLE_COULDNT_RESOLVE_HOST);
208 return Count(true);
211 bool TestExtCurl::test_curl_error() {
212 Variant c = HHVM_FN(curl_init)("http://www.thereisnosuchanurl");
213 HHVM_FN(curl_setopt)(c.toResource(), k_CURLOPT_RETURNTRANSFER, true);
214 HHVM_FN(curl_exec)(c.toResource());
215 Variant err = HHVM_FN(curl_error)(c.toResource());
216 VERIFY(equal(err, String("Couldn't resolve host 'www.thereisnosuchanurl'")) ||
217 equal(err, String("Could not resolve host: www.thereisnosuchanurl"
218 " (Domain name not found)")));
219 return Count(true);
222 bool TestExtCurl::test_curl_close() {
223 Variant c = HHVM_FN(curl_init)(String(get_request_uri()));
224 HHVM_FN(curl_setopt)(c.toResource(), k_CURLOPT_RETURNTRANSFER, true);
225 HHVM_FN(curl_exec)(c.toResource());
226 HHVM_FN(curl_close)(c.toResource());
227 return Count(true);
230 bool TestExtCurl::test_curl_multi_init() {
231 HHVM_FN(curl_multi_init)();
232 return Count(true);
235 bool TestExtCurl::test_curl_multi_add_handle() {
236 Resource mh = HHVM_FN(curl_multi_init)();
237 Variant c1 = HHVM_FN(curl_init)(String(get_request_uri()));
238 Variant c2 = HHVM_FN(curl_init)(String(get_request_uri()));
239 HHVM_FN(curl_multi_add_handle)(mh, c1.toResource());
240 HHVM_FN(curl_multi_add_handle)(mh, c2.toResource());
241 return Count(true);
244 bool TestExtCurl::test_curl_multi_remove_handle() {
245 Resource mh = HHVM_FN(curl_multi_init)();
246 Variant c1 = HHVM_FN(curl_init)(String(get_request_uri()));
247 Variant c2 = HHVM_FN(curl_init)(String(get_request_uri()));
248 HHVM_FN(curl_multi_add_handle)(mh, c1.toResource());
249 HHVM_FN(curl_multi_add_handle)(mh, c2.toResource());
250 HHVM_FN(curl_multi_remove_handle)(mh, c1.toResource());
251 return Count(true);
254 bool TestExtCurl::test_curl_multi_exec() {
255 Resource mh = HHVM_FN(curl_multi_init)();
256 Variant c1 = HHVM_FN(curl_init)(String(get_request_uri()));
257 Variant c2 = HHVM_FN(curl_init)(String(get_request_uri()));
258 HHVM_FN(curl_setopt)(c1.toResource(), k_CURLOPT_RETURNTRANSFER, true);
259 HHVM_FN(curl_setopt)(c2.toResource(), k_CURLOPT_RETURNTRANSFER, true);
260 HHVM_FN(curl_multi_add_handle)(mh, c1.toResource());
261 HHVM_FN(curl_multi_add_handle)(mh, c2.toResource());
263 Variant still_running;
264 do {
265 HHVM_FN(curl_multi_exec)(mh, ref(still_running));
266 } while (more(still_running, 0));
268 return Count(true);
271 bool TestExtCurl::test_curl_multi_select() {
272 Resource mh = HHVM_FN(curl_multi_init)();
273 Variant c1 = HHVM_FN(curl_init)(String(get_request_uri()));
274 Variant c2 = HHVM_FN(curl_init)(String(get_request_uri()));
275 HHVM_FN(curl_multi_add_handle)(mh, c1.toResource());
276 HHVM_FN(curl_multi_add_handle)(mh, c2.toResource());
277 VS(HHVM_FN(curl_multi_select)(mh), 0);
278 return Count(true);
281 bool TestExtCurl::test_curl_multi_getcontent() {
282 Resource mh = HHVM_FN(curl_multi_init)();
283 Variant c1 = HHVM_FN(curl_init)(String(get_request_uri()));
284 Variant c2 = HHVM_FN(curl_init)(String(get_request_uri()));
285 HHVM_FN(curl_setopt)(c1.toResource(), k_CURLOPT_RETURNTRANSFER, true);
286 HHVM_FN(curl_setopt)(c2.toResource(), k_CURLOPT_RETURNTRANSFER, true);
287 HHVM_FN(curl_multi_add_handle)(mh, c1.toResource());
288 HHVM_FN(curl_multi_add_handle)(mh, c2.toResource());
290 Variant still_running;
291 do {
292 HHVM_FN(curl_multi_exec)(mh, ref(still_running));
293 } while (more(still_running, 0));
295 VS(HHVM_FN(curl_multi_getcontent)(c1.toResource()), "OK");
296 VS(HHVM_FN(curl_multi_getcontent)(c1.toResource()), "OK");
297 VS(HHVM_FN(curl_multi_getcontent)(c2.toResource()), "OK");
298 VS(HHVM_FN(curl_multi_getcontent)(c2.toResource()), "OK");
299 return Count(true);
302 bool TestExtCurl::test_curl_multi_info_read() {
303 Resource mh = HHVM_FN(curl_multi_init)();
304 Variant c1 = HHVM_FN(curl_init)(String(get_request_uri()));
305 Variant c2 = HHVM_FN(curl_init)(String(get_request_uri()));
306 HHVM_FN(curl_setopt)(c1.toResource(), k_CURLOPT_RETURNTRANSFER, true);
307 HHVM_FN(curl_setopt)(c2.toResource(), k_CURLOPT_RETURNTRANSFER, true);
308 HHVM_FN(curl_multi_add_handle)(mh, c1.toResource());
309 HHVM_FN(curl_multi_add_handle)(mh, c2.toResource());
311 Variant still_running;
312 do {
313 HHVM_FN(curl_multi_exec)(mh, ref(still_running));
314 } while (more(still_running, 0));
316 Variant ret = HHVM_FN(curl_multi_info_read)(mh);
317 VS(ret[s_result], 0);
318 return Count(true);
321 bool TestExtCurl::test_curl_multi_close() {
322 Resource mh = HHVM_FN(curl_multi_init)();
323 Variant c1 = HHVM_FN(curl_init)(String(get_request_uri()));
324 Variant c2 = HHVM_FN(curl_init)(String(get_request_uri()));
325 HHVM_FN(curl_setopt)(c1.toResource(), k_CURLOPT_RETURNTRANSFER, true);
326 HHVM_FN(curl_setopt)(c2.toResource(), k_CURLOPT_RETURNTRANSFER, true);
327 HHVM_FN(curl_multi_add_handle)(mh, c1.toResource());
328 HHVM_FN(curl_multi_add_handle)(mh, c2.toResource());
330 Variant still_running;
331 do {
332 HHVM_FN(curl_multi_exec)(mh, ref(still_running));
333 } while (more(still_running, 0));
335 HHVM_FN(curl_multi_close)(mh);
336 return Count(true);