xref: /PHP-5.3/ext/curl/php_curl.h (revision a2045ff3)
1 /*
2    +----------------------------------------------------------------------+
3    | PHP Version 5                                                        |
4    +----------------------------------------------------------------------+
5    | Copyright (c) 1997-2013 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 #include <curl/curl.h>
38 #include <curl/multi.h>
39 
40 extern zend_module_entry curl_module_entry;
41 #define curl_module_ptr &curl_module_entry
42 
43 #define CURLOPT_RETURNTRANSFER 19913
44 #define CURLOPT_BINARYTRANSFER 19914
45 #define PHP_CURL_STDOUT 0
46 #define PHP_CURL_FILE   1
47 #define PHP_CURL_USER   2
48 #define PHP_CURL_DIRECT 3
49 #define PHP_CURL_RETURN 4
50 #define PHP_CURL_ASCII  5
51 #define PHP_CURL_BINARY 6
52 #define PHP_CURL_IGNORE 7
53 
54 extern int  le_curl;
55 #define le_curl_name "cURL handle"
56 extern int  le_curl_multi_handle;
57 #define le_curl_multi_handle_name "cURL Multi Handle"
58 
59 PHP_MINIT_FUNCTION(curl);
60 PHP_MSHUTDOWN_FUNCTION(curl);
61 PHP_MINFO_FUNCTION(curl);
62 PHP_FUNCTION(curl_version);
63 PHP_FUNCTION(curl_init);
64 PHP_FUNCTION(curl_copy_handle);
65 PHP_FUNCTION(curl_setopt);
66 PHP_FUNCTION(curl_setopt_array);
67 PHP_FUNCTION(curl_exec);
68 PHP_FUNCTION(curl_getinfo);
69 PHP_FUNCTION(curl_error);
70 PHP_FUNCTION(curl_errno);
71 PHP_FUNCTION(curl_close);
72 PHP_FUNCTION(curl_multi_init);
73 PHP_FUNCTION(curl_multi_add_handle);
74 PHP_FUNCTION(curl_multi_remove_handle);
75 PHP_FUNCTION(curl_multi_select);
76 PHP_FUNCTION(curl_multi_exec);
77 PHP_FUNCTION(curl_multi_getcontent);
78 PHP_FUNCTION(curl_multi_info_read);
79 PHP_FUNCTION(curl_multi_close);
80 void _php_curl_multi_close(zend_rsrc_list_entry * TSRMLS_DC);
81 
82 typedef struct {
83 	zval            *func_name;
84 	zend_fcall_info_cache fci_cache;
85 	FILE            *fp;
86 	smart_str       buf;
87 	int             method;
88 	int             type;
89 	zval		*stream;
90 } php_curl_write;
91 
92 typedef struct {
93 	zval            *func_name;
94 	zend_fcall_info_cache fci_cache;
95 	FILE            *fp;
96 	long            fd;
97 	int             method;
98 	zval		*stream;
99 } php_curl_read;
100 
101 typedef struct {
102 	zval 		*func_name;
103 	zend_fcall_info_cache fci_cache;
104 	int    	        method;
105 } php_curl_progress;
106 
107 typedef struct {
108 	php_curl_write *write;
109 	php_curl_write *write_header;
110 	php_curl_read  *read;
111 	zval           *passwd;
112 	zval           *std_err;
113 	php_curl_progress *progress;
114 } php_curl_handlers;
115 
116 struct _php_curl_error  {
117 	char str[CURL_ERROR_SIZE + 1];
118 	int  no;
119 };
120 
121 struct _php_curl_send_headers {
122 	char *str;
123 	size_t str_len;
124 };
125 
126 struct _php_curl_free {
127 	zend_llist str;
128 	zend_llist post;
129 	zend_llist slist;
130 };
131 
132 typedef struct {
133 	struct _php_curl_error   err;
134 	struct _php_curl_free    *to_free;
135 	struct _php_curl_send_headers header;
136 	void ***thread_ctx;
137 	CURL                    *cp;
138 	php_curl_handlers       *handlers;
139 	long                     id;
140 	unsigned int             uses;
141 	zend_bool                in_callback;
142 	zval                     *clone;
143 } php_curl;
144 
145 typedef struct {
146 	int    still_running;
147 	CURLM *multi;
148 	zend_llist easyh;
149 } php_curlm;
150 
151 void _php_curl_cleanup_handle(php_curl *);
152 void _php_curl_multi_cleanup_list(void *data);
153 int  _php_curl_verify_handlers(php_curl *ch, int reporterror TSRMLS_DC);
154 
155 /* streams support */
156 
157 extern php_stream_ops php_curl_stream_ops;
158 #define PHP_STREAM_IS_CURL	&php_curl_stream_ops
159 
160 php_stream *php_curl_stream_opener(php_stream_wrapper *wrapper, char *filename, char *mode,
161 		int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC);
162 
163 extern php_stream_wrapper php_curl_wrapper;
164 
165 struct php_curl_buffer {
166 	off_t readpos, writepos;
167 	php_stream *buf;
168 };
169 
170 typedef struct {
171 	CURL	*curl;
172 	CURLM	*multi;
173 	char *url;
174 	struct php_curl_buffer readbuffer; /* holds downloaded data */
175 	struct php_curl_buffer writebuffer; /* holds data to upload */
176 
177 	fd_set readfds, writefds, excfds;
178 	int maxfd;
179 
180 	char errstr[CURL_ERROR_SIZE + 1];
181 	CURLMcode mcode;
182 	int pending;
183 	zval *headers;
184 	struct curl_slist *headers_slist; /* holds custom headers sent out in the request */
185 } php_curl_stream;
186 
187 
188 #else
189 #define curl_module_ptr NULL
190 #endif /* HAVE_CURL */
191 #define phpext_curl_ptr curl_module_ptr
192 #endif  /* _PHP_CURL_H */
193