* if curl sees a 3xx code, a Location header and a Connection:close header it decides...
[m6w6/ext-http] / php_http_request.h
1 /*
2 +--------------------------------------------------------------------+
3 | PECL :: http |
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2004-2010, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
11 */
12
13 /* $Id: php_http_request_api.h 292841 2009-12-31 08:48:57Z mike $ */
14
15 #ifndef PHP_HTTP_REQUEST_H
16 #define PHP_HTTP_REQUEST_H
17
18 #include <curl/curl.h>
19
20 #include "php_http_request_method.h"
21 #include "php_http_request_pool.h"
22
23 extern PHP_MINIT_FUNCTION(http_request);
24 extern PHP_MSHUTDOWN_FUNCTION(http_request);
25
26 typedef struct php_http_request_progress_state_counter {
27 double now;
28 double total;
29 } php_http_request_progress_state_counter_t;
30
31 typedef struct php_http_request_progress_state {
32 php_http_request_progress_state_counter_t ul;
33 php_http_request_progress_state_counter_t dl;
34 } php_http_request_progress_state_t;
35
36 typedef struct php_http_request {
37 CURL *ch;
38 char *url;
39 php_http_request_method_t meth;
40 php_http_message_body_t *body;
41 struct {
42 php_http_message_parser_t *ctx;
43 php_http_message_t *msg;
44 php_http_buffer_t *buf;
45 } parser;
46
47 struct {
48 php_http_buffer_t cookies;
49 HashTable options;
50 struct curl_slist *headers;
51 long redirects;
52 } _cache;
53
54 struct {
55 uint count;
56 double delay;
57 } _retry;
58
59 struct {
60 struct {
61 struct {
62 double now;
63 double total;
64 } ul;
65 struct {
66 double now;
67 double total;
68 } dl;
69 } state;
70 zval *callback;
71 unsigned in_cb:1;
72 } _progress;
73
74 #ifdef ZTS
75 void ***ts;
76 #endif
77
78 } php_http_request_t;
79
80 /* CURLOPT_PRIVATE storage living as long as a CURL handle */
81 typedef struct php_http_request_storage {
82 char *url;
83 char *cookiestore;
84 char errorbuffer[CURL_ERROR_SIZE];
85 } php_http_request_storage_t;
86
87
88 static inline php_http_request_storage_t *php_http_request_storage_get(CURL *ch)
89 {
90 php_http_request_storage_t *st = NULL;
91 curl_easy_getinfo(ch, CURLINFO_PRIVATE, &st);
92 return st;
93 }
94
95 PHP_HTTP_API CURL *php_http_curl_init(CURL *ch, php_http_request_t *request TSRMLS_DC);
96 PHP_HTTP_API void php_http_curl_free(CURL **ch TSRMLS_DC);
97 PHP_HTTP_API CURL *php_http_curl_copy(CURL *ch TSRMLS_DC);
98
99 #define PHP_HTTP_CHECK_CURL_INIT(ch, init, action) \
100 if ((!(ch)) && (!((ch) = init))) { \
101 php_http_error(HE_WARNING, PHP_HTTP_E_REQUEST, "Could not initialize curl"); \
102 action; \
103 }
104
105
106 PHP_HTTP_API php_http_request_t *php_http_request_init(php_http_request_t *request, CURL *ch, php_http_request_method_t meth, const char *url TSRMLS_DC);
107 PHP_HTTP_API void php_http_request_dtor(php_http_request_t *request);
108 PHP_HTTP_API void php_http_request_free(php_http_request_t **request);
109 PHP_HTTP_API void php_http_request_reset(php_http_request_t *r);
110 PHP_HTTP_API STATUS php_http_request_enable_cookies(php_http_request_t *request);
111 PHP_HTTP_API STATUS php_http_request_reset_cookies(php_http_request_t *request, int session_only);
112 PHP_HTTP_API STATUS php_http_request_flush_cookies(php_http_request_t *request);
113 PHP_HTTP_API void php_http_request_defaults(php_http_request_t *request);
114 PHP_HTTP_API STATUS php_http_request_prepare(php_http_request_t *request, HashTable *options);
115 PHP_HTTP_API void php_http_request_exec(php_http_request_t *request);
116 PHP_HTTP_API void php_http_request_info(php_http_request_t *request, HashTable *info);
117 PHP_HTTP_API void php_http_request_set_progress_callback(php_http_request_t *request, zval *cb);
118
119
120 typedef struct php_http_request_object {
121 zend_object zo;
122 php_http_request_t *request;
123 php_http_request_pool_t *pool;
124 php_http_request_datashare_t *share;
125 } php_http_request_object_t;
126
127 extern zend_class_entry *php_http_request_class_entry;
128 extern zend_function_entry php_http_request_method_entry[];
129
130 extern zend_object_value php_http_request_object_new(zend_class_entry *ce TSRMLS_DC);
131 extern zend_object_value php_http_request_object_new_ex(zend_class_entry *ce, CURL *ch, php_http_request_object_t **ptr TSRMLS_DC);
132 extern zend_object_value php_http_request_object_clone(zval *zobject TSRMLS_DC);
133 extern void php_http_request_object_free(void *object TSRMLS_DC);
134
135 extern STATUS php_http_request_object_requesthandler(php_http_request_object_t *obj, zval *this_ptr TSRMLS_DC);
136 extern STATUS php_http_request_object_responsehandler(php_http_request_object_t *obj, zval *this_ptr TSRMLS_DC);
137
138 PHP_METHOD(HttpRequest, __construct);
139 PHP_METHOD(HttpRequest, setOptions);
140 PHP_METHOD(HttpRequest, getOptions);
141 PHP_METHOD(HttpRequest, addSslOptions);
142 PHP_METHOD(HttpRequest, setSslOptions);
143 PHP_METHOD(HttpRequest, getSslOptions);
144 PHP_METHOD(HttpRequest, addHeaders);
145 PHP_METHOD(HttpRequest, getHeaders);
146 PHP_METHOD(HttpRequest, setHeaders);
147 PHP_METHOD(HttpRequest, addCookies);
148 PHP_METHOD(HttpRequest, getCookies);
149 PHP_METHOD(HttpRequest, setCookies);
150 PHP_METHOD(HttpRequest, enableCookies);
151 PHP_METHOD(HttpRequest, resetCookies);
152 PHP_METHOD(HttpRequest, flushCookies);
153 PHP_METHOD(HttpRequest, setMethod);
154 PHP_METHOD(HttpRequest, getMethod);
155 PHP_METHOD(HttpRequest, setUrl);
156 PHP_METHOD(HttpRequest, getUrl);
157 PHP_METHOD(HttpRequest, setContentType);
158 PHP_METHOD(HttpRequest, getContentType);
159 PHP_METHOD(HttpRequest, setQueryData);
160 PHP_METHOD(HttpRequest, getQueryData);
161 PHP_METHOD(HttpRequest, addQueryData);
162 PHP_METHOD(HttpRequest, getBody);
163 PHP_METHOD(HttpRequest, setBody);
164 PHP_METHOD(HttpRequest, addBody);
165 PHP_METHOD(HttpRequest, send);
166 PHP_METHOD(HttpRequest, getResponseData);
167 PHP_METHOD(HttpRequest, getResponseHeader);
168 PHP_METHOD(HttpRequest, getResponseCookies);
169 PHP_METHOD(HttpRequest, getResponseCode);
170 PHP_METHOD(HttpRequest, getResponseStatus);
171 PHP_METHOD(HttpRequest, getResponseBody);
172 PHP_METHOD(HttpRequest, getResponseInfo);
173 PHP_METHOD(HttpRequest, getResponseMessage);
174 PHP_METHOD(HttpRequest, getRawResponseMessage);
175 PHP_METHOD(HttpRequest, getRequestMessage);
176 PHP_METHOD(HttpRequest, getRawRequestMessage);
177 PHP_METHOD(HttpRequest, getHistory);
178 PHP_METHOD(HttpRequest, clearHistory);
179 PHP_METHOD(HttpRequest, getMessageClass);
180 PHP_METHOD(HttpRequest, setMessageClass);
181
182 #endif
183
184 /*
185 * Local variables:
186 * tab-width: 4
187 * c-basic-offset: 4
188 * End:
189 * vim600: noet sw=4 ts=4 fdm=marker
190 * vim<600: noet sw=4 ts=4
191 */
192