| 112 client->addrlen = addrlen; |
112 client->addrlen = addrlen; |
| 113 |
113 |
| 114 return 0; |
114 return 0; |
| 115 } |
115 } |
| 116 |
116 |
| |
117 int http_client_set_socket(HttpClient *client, int socketfd) { |
| |
118 client->socketfd = socketfd; |
| |
119 if(util_socket_setnonblock(socketfd, 1)) { |
| |
120 client->socketfd = -1; |
| |
121 return 1; |
| |
122 } |
| |
123 return 0; |
| |
124 } |
| |
125 |
| 117 int http_client_set_method(HttpClient *client, const char *method) { |
126 int http_client_set_method(HttpClient *client, const char *method) { |
| 118 return http_client_set_method_len(client, method, method ? strlen(method) : 0); |
127 return http_client_set_method_len(client, method, method ? strlen(method) : 0); |
| 119 } |
128 } |
| 120 |
129 |
| 121 int http_client_set_uri(HttpClient *client, const char *uri) { |
130 int http_client_set_uri(HttpClient *client, const char *uri) { |
| 183 int http_client_enable_chunked_transfer_encoding(HttpClient *client) { |
192 int http_client_enable_chunked_transfer_encoding(HttpClient *client) { |
| 184 client->req_content_length = -1; |
193 client->req_content_length = -1; |
| 185 return http_client_add_request_header(client, cx_mutstr("transfer-encoding"), cx_mutstr("chunked")); |
194 return http_client_add_request_header(client, cx_mutstr("transfer-encoding"), cx_mutstr("chunked")); |
| 186 } |
195 } |
| 187 |
196 |
| |
197 static int client_start_poll(HttpClient *client, int in) { |
| |
198 client->event.fn = client_connected; |
| |
199 client->event.finish = client_finished; |
| |
200 if(in) { |
| |
201 return ev_pollin(client->ev, client->socketfd, &client->event); |
| |
202 } else { |
| |
203 return ev_pollout(client->ev, client->socketfd, &client->event); |
| |
204 } |
| |
205 } |
| |
206 |
| 188 int http_client_start(HttpClient *client) { |
207 int http_client_start(HttpClient *client) { |
| |
208 client->event.cookie = client; |
| |
209 if(client->socketfd != -1) { |
| |
210 int ret = client_connected(client->ev, &client->event); |
| |
211 if(ret != 0) { |
| |
212 return client_start_poll(client, 1); // TODO: check event type |
| |
213 } |
| |
214 return 0; |
| |
215 } |
| |
216 |
| 189 int socketfd = socket(client->domain, SOCK_STREAM, 0); |
217 int socketfd = socket(client->domain, SOCK_STREAM, 0); |
| 190 if(socketfd < 0) { |
218 if(socketfd < 0) { |
| 191 return 1; |
219 return 1; |
| 192 } |
220 } |
| 193 |
|
| 194 if(util_socket_setnonblock(socketfd, 1)) { |
221 if(util_socket_setnonblock(socketfd, 1)) { |
| 195 close(socketfd); |
|
| 196 return 1; |
222 return 1; |
| 197 } |
223 } |
| 198 |
|
| 199 client->socketfd = socketfd; |
224 client->socketfd = socketfd; |
| 200 |
|
| 201 client->event.cookie = client; |
|
| 202 client->event.fn = client_connected; |
|
| 203 client->event.finish = client_finished; |
|
| 204 |
225 |
| 205 int ret = 1; |
226 int ret = 1; |
| 206 if(connect(socketfd, client->addr, client->addrlen)) { |
227 if(connect(socketfd, client->addr, client->addrlen)) { |
| 207 int err = errno; |
228 int err = errno; |
| 208 if(err == EINPROGRESS) { |
229 if(err == EINPROGRESS) { |
| 209 ret = ev_pollout(client->ev, socketfd, &client->event); |
230 ret = client_start_poll(client, 1); |
| 210 } else { |
231 } else { |
| 211 log_ereport(LOG_FAILURE, "http-client-start: connect failed: %s", strerror(err)); |
232 log_ereport(LOG_FAILURE, "http-client-start: connect failed: %s", strerror(err)); |
| 212 } |
233 } |
| 213 } else { |
234 } else { |
| 214 ret = 0; // TODO |
235 ret = 0; // TODO |
| 215 } |
236 } |
| 216 |
237 |
| 217 if(ret) { |
238 if(ret) { |
| 218 close(socketfd); |
239 close(socketfd); |
| |
240 client->socketfd = -1; |
| 219 } |
241 } |
| 220 return ret; |
242 return ret; |
| 221 } |
243 } |
| 222 |
244 |
| 223 int http_client_process(HttpClient *client) { |
245 int http_client_process(HttpClient *client) { |