2 +----------------------------------------------------------------------+
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"
26 ///////////////////////////////////////////////////////////////////////////////
28 class TestCurlRequestHandler
: public RequestHandler
{
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
) {
37 const void *data
= transport
->getPostData(len
);
38 String res
= "POST: ";
39 res
+= String((char*)data
, len
, CopyString
);
40 transport
->sendString(res
.c_str());
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
) +
57 static ServerPtr
runServer() {
58 for (s_server_port
= PORT_MIN
; s_server_port
<= PORT_MAX
; s_server_port
++) {
60 ServerPtr server
= folly::make_unique
<LibEventServer
>(
61 "127.0.0.1", s_server_port
, 4);
62 server
->setRequestHandlerFactory
<TestCurlRequestHandler
>(0);
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
) {
78 DECLARE_TEST_FUNCTIONS("function curl_write_func($s1, $s2) {"
79 " print 'curl_write_func called with ';"
81 " return strlen($s2);"
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
);
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()), "");
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
) {
136 static const StaticString
137 s_protocols("protocols"),
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());
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());
160 bool TestExtCurl::test_curl_setopt_array() {
161 Variant c
= HHVM_FN(curl_init
)();
162 HHVM_FN(curl_setopt_array
)
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());
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());
179 Variant c
= HHVM_FN(curl_init
)(String(get_request_uri()));
180 HHVM_FN(curl_setopt
)(c
.toResource(), k_CURLOPT_WRITEFUNCTION
,
183 HHVM_FN(curl_exec
)(c
.toResource());
184 String res
= f_ob_get_contents();
185 VS(res
, "curl_write_func called with OK");
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()));
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
);
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)")));
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());
230 bool TestExtCurl::test_curl_multi_init() {
231 HHVM_FN(curl_multi_init
)();
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());
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());
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
;
265 HHVM_FN(curl_multi_exec
)(mh
, ref(still_running
));
266 } while (more(still_running
, 0));
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);
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
;
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");
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
;
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);
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
;
332 HHVM_FN(curl_multi_exec
)(mh
, ref(still_running
));
333 } while (more(still_running
, 0));
335 HHVM_FN(curl_multi_close
)(mh
);