19
19
* as published by the Free Software Foundation; either version
20
20
* 2 of the License, or (at your option) any later version.
22
* Copyright (C) 2001-2009 Alexandre Cassen, <acassen@freebox.fr>
22
* Copyright (C) 2001-2011 Alexandre Cassen, <acassen@linux-vs.org>
57
57
/* free allocated pieces */
59
free_all(thread * thread_obj)
59
free_all(thread_t * thread)
61
SOCK *sock_obj = THREAD_ARG(thread_obj);
61
SOCK *sock_obj = THREAD_ARG(thread);
63
63
DBG("Total read size read = %d Bytes, fd:%d\n",
64
64
sock_obj->total_size, sock_obj->fd);
71
71
* => free the reserved thread
73
73
req->response_time = timer_tol(timer_now());
74
thread_add_terminate_event(thread_obj->master);
74
thread_add_terminate_event(thread->master);
77
77
/* Simple epilog functions. */
79
epilog(thread * thread_obj)
79
epilog(thread_t * thread)
81
81
DBG("Timeout on URL : [%s]\n", req->url);
86
86
/* Simple finalization function */
88
finalize(thread * thread_obj)
88
finalize(thread_t * thread)
90
SOCK *sock_obj = THREAD_ARG(thread_obj);
90
SOCK *sock_obj = THREAD_ARG(thread);
91
91
unsigned char digest[16];
172
172
/* Asynchronous HTTP stream reader */
174
http_read_thread(thread * thread_obj)
174
http_read_thread(thread_t * thread)
176
SOCK *sock_obj = THREAD_ARG(thread_obj);
176
SOCK *sock_obj = THREAD_ARG(thread);
179
179
/* Handle read timeout */
180
if (thread_obj->type == THREAD_READ_TIMEOUT)
181
return epilog(thread_obj);
180
if (thread->type == THREAD_READ_TIMEOUT)
181
return epilog(thread);
183
183
/* read the HTTP stream */
184
184
memset(sock_obj->buffer, 0, MAX_BUFFER_LENGTH);
185
r = read(thread_obj->u.fd, sock_obj->buffer + sock_obj->size,
185
r = read(thread->u.fd, sock_obj->buffer + sock_obj->size,
186
186
MAX_BUFFER_LENGTH - sock_obj->size);
188
188
DBG(" [l:%d,fd:%d]\n", r, sock_obj->fd);
193
193
DBG("Read error with server [%s:%d]: %s\n",
194
194
inet_ntop2(req->addr_ip), ntohs(req->addr_port),
195
195
strerror(errno));
196
return epilog(thread_obj);
196
return epilog(thread);
199
199
/* All the HTTP stream has been parsed */
200
finalize(thread_obj);
202
202
/* Handle the response stream */
203
203
http_process_stream(sock_obj, r);
206
206
* Register next http stream reader.
207
207
* Register itself to not perturbe global I/O multiplexer.
209
thread_add_read(thread_obj->master, http_read_thread, sock_obj,
210
thread_obj->u.fd, HTTP_CNX_TIMEOUT);
209
thread_add_read(thread->master, http_read_thread, sock_obj,
210
thread->u.fd, HTTP_CNX_TIMEOUT);
218
218
* Apply trigger check to this result.
221
http_response_thread(thread * thread_obj)
221
http_response_thread(thread_t * thread)
223
SOCK *sock_obj = THREAD_ARG(thread_obj);
223
SOCK *sock_obj = THREAD_ARG(thread);
225
225
/* Handle read timeout */
226
if (thread_obj->type == THREAD_READ_TIMEOUT)
227
return epilog(thread_obj);
226
if (thread->type == THREAD_READ_TIMEOUT)
227
return epilog(thread);
229
229
/* Allocate & clean the get buffer */
230
230
sock_obj->buffer = (char *) MALLOC(MAX_BUFFER_LENGTH);
235
235
/* Register asynchronous http/ssl read thread */
237
thread_add_read(thread_obj->master, ssl_read_thread, sock_obj,
238
thread_obj->u.fd, HTTP_CNX_TIMEOUT);
237
thread_add_read(thread->master, ssl_read_thread, sock_obj,
238
thread->u.fd, HTTP_CNX_TIMEOUT);
240
thread_add_read(thread_obj->master, http_read_thread, sock_obj,
241
thread_obj->u.fd, HTTP_CNX_TIMEOUT);
240
thread_add_read(thread->master, http_read_thread, sock_obj,
241
thread->u.fd, HTTP_CNX_TIMEOUT);
245
245
/* remote Web server is connected, send it the get url query. */
247
http_request_thread(thread * thread_obj)
247
http_request_thread(thread_t * thread)
249
SOCK *sock_obj = THREAD_ARG(thread_obj);
249
SOCK *sock_obj = THREAD_ARG(thread);
250
250
char *str_request;
253
253
/* Handle read timeout */
254
if (thread_obj->type == THREAD_WRITE_TIMEOUT)
255
return epilog(thread_obj);
254
if (thread->type == THREAD_WRITE_TIMEOUT)
255
return epilog(thread);
257
257
/* Allocate & clean the GET string */
258
258
str_request = (char *) MALLOC(GET_BUFFER_LENGTH);
279
279
fprintf(stderr, "Cannot send get request to [%s:%d].\n",
280
280
inet_ntop2(req->addr_ip)
281
281
, ntohs(req->addr_port));
282
return epilog(thread_obj);
282
return epilog(thread);
285
285
/* Register read timeouted thread */
286
thread_add_read(thread_obj->master, http_response_thread, sock_obj,
286
thread_add_read(thread->master, http_response_thread, sock_obj,
287
287
sock_obj->fd, HTTP_CNX_TIMEOUT);