1/*
2 +----------------------------------------------------------------------+
3 | PHP Version 5 |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 1997-2015 The PHP Group |
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 +----------------------------------------------------------------------+
15 | Author: Sterling Hughes <sterling@php.net> |
16 | Wez Furlong <wez@thebrainroom.com> |
17 +----------------------------------------------------------------------+
18*/
19
20/* $Id$ */
21
22#ifndef _PHP_CURL_H
23#define _PHP_CURL_H
24
25#include "php.h"
26#include "ext/standard/php_smart_str.h"
27
28#ifdef COMPILE_DL_CURL
29#undef HAVE_CURL
30#define HAVE_CURL 1
31#endif
32
33#if HAVE_CURL
34
35#define PHP_CURL_DEBUG 0
36
37#ifdef PHP_WIN32
38# define PHP_CURL_API __declspec(dllexport)
39#elif defined(__GNUC__) && __GNUC__ >= 4
40# define PHP_CURL_API __attribute__ ((visibility("default")))
41#else
42# define PHP_CURL_API
43#endif
44
45#include <curl/curl.h>
46#include <curl/multi.h>
47
48extern zend_module_entry curl_module_entry;
49#define curl_module_ptr &curl_module_entry
50
51#define CURLOPT_RETURNTRANSFER 19913
52#define CURLOPT_BINARYTRANSFER 19914 /* For Backward compatibility */
53#define PHP_CURL_STDOUT 0
54#define PHP_CURL_FILE 1
55#define PHP_CURL_USER 2
56#define PHP_CURL_DIRECT 3
57#define PHP_CURL_RETURN 4
58#define PHP_CURL_IGNORE 7
59
60extern int le_curl;
61#define le_curl_name "cURL handle"
62extern int le_curl_multi_handle;
63#define le_curl_multi_handle_name "cURL Multi Handle"
64extern int le_curl_share_handle;
65#define le_curl_share_handle_name "cURL Share Handle"
66
67PHP_MINIT_FUNCTION(curl);
68PHP_MSHUTDOWN_FUNCTION(curl);
69PHP_MINFO_FUNCTION(curl);
70
71PHP_FUNCTION(curl_close);
72PHP_FUNCTION(curl_copy_handle);
73PHP_FUNCTION(curl_errno);
74PHP_FUNCTION(curl_error);
75PHP_FUNCTION(curl_exec);
76PHP_FUNCTION(curl_getinfo);
77PHP_FUNCTION(curl_init);
78PHP_FUNCTION(curl_setopt);
79PHP_FUNCTION(curl_setopt_array);
80PHP_FUNCTION(curl_version);
81
82PHP_FUNCTION(curl_multi_add_handle);
83PHP_FUNCTION(curl_multi_close);
84PHP_FUNCTION(curl_multi_exec);
85PHP_FUNCTION(curl_multi_getcontent);
86PHP_FUNCTION(curl_multi_info_read);
87PHP_FUNCTION(curl_multi_init);
88PHP_FUNCTION(curl_multi_remove_handle);
89PHP_FUNCTION(curl_multi_select);
90
91PHP_FUNCTION(curl_share_close);
92PHP_FUNCTION(curl_share_init);
93PHP_FUNCTION(curl_share_setopt);
94
95#if LIBCURL_VERSION_NUM >= 0x070c00 /* 7.12.0 */
96PHP_FUNCTION(curl_strerror);
97PHP_FUNCTION(curl_multi_strerror);
98#endif
99
100#if LIBCURL_VERSION_NUM >= 0x070c01 /* 7.12.1 */
101PHP_FUNCTION(curl_reset);
102#endif
103
104#if LIBCURL_VERSION_NUM >= 0x070f04 /* 7.15.4 */
105PHP_FUNCTION(curl_escape);
106PHP_FUNCTION(curl_unescape);
107
108PHP_FUNCTION(curl_multi_setopt);
109#endif
110
111#if LIBCURL_VERSION_NUM >= 0x071200 /* 7.18.0 */
112PHP_FUNCTION(curl_pause);
113#endif
114PHP_FUNCTION(curl_file_create);
115
116
117void _php_curl_multi_close(zend_rsrc_list_entry * TSRMLS_DC);
118void _php_curl_share_close(zend_rsrc_list_entry * TSRMLS_DC);
119
120typedef struct {
121 zval *func_name;
122 zend_fcall_info_cache fci_cache;
123 FILE *fp;
124 smart_str buf;
125 int method;
126 zval *stream;
127} php_curl_write;
128
129typedef struct {
130 zval *func_name;
131 zend_fcall_info_cache fci_cache;
132 FILE *fp;
133 long fd;
134 int method;
135 zval *stream;
136} php_curl_read;
137
138typedef struct {
139 zval *func_name;
140 zend_fcall_info_cache fci_cache;
141 int method;
142} php_curl_progress, php_curl_fnmatch;
143
144typedef struct {
145 php_curl_write *write;
146 php_curl_write *write_header;
147 php_curl_read *read;
148#if CURLOPT_PASSWDFUNCTION != 0
149 zval *passwd;
150#endif
151 zval *std_err;
152 php_curl_progress *progress;
153#if LIBCURL_VERSION_NUM >= 0x071500 /* Available since 7.21.0 */
154 php_curl_fnmatch *fnmatch;
155#endif
156} php_curl_handlers;
157
158struct _php_curl_error {
159 char str[CURL_ERROR_SIZE + 1];
160 int no;
161};
162
163struct _php_curl_send_headers {
164 char *str;
165 size_t str_len;
166};
167
168struct _php_curl_free {
169 zend_llist str;
170 zend_llist post;
171 HashTable *slist;
172};
173
174typedef struct {
175 struct _php_curl_error err;
176 struct _php_curl_free *to_free;
177 struct _php_curl_send_headers header;
178 void ***thread_ctx;
179 CURL *cp;
180 php_curl_handlers *handlers;
181 long id;
182 zend_bool in_callback;
183 zval *clone;
184 zend_bool safe_upload;
185} php_curl;
186
187#define CURLOPT_SAFE_UPLOAD -1
188
189typedef struct {
190 int still_running;
191 CURLM *multi;
192 zend_llist easyh;
193} php_curlm;
194
195typedef struct {
196 CURLSH *share;
197} php_curlsh;
198
199void _php_curl_cleanup_handle(php_curl *);
200void _php_curl_multi_cleanup_list(void *data);
201void _php_curl_verify_handlers(php_curl *ch, int reporterror TSRMLS_DC);
202
203void curlfile_register_class(TSRMLS_D);
204PHP_CURL_API extern zend_class_entry *curl_CURLFile_class;
205
206#else
207#define curl_module_ptr NULL
208#endif /* HAVE_CURL */
209#define phpext_curl_ptr curl_module_ptr
210#endif /* _PHP_CURL_H */
211