src/server/proxy/httpclient.c

changeset 701
936e5487418a
parent 700
658f4c02b4c5
equal deleted inserted replaced
700:658f4c02b4c5 701:936e5487418a
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) {

mercurial