diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2011-09-16 12:38:26 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2011-09-16 12:38:26 +0000 |
commit | 063adb71c2a42c2733e0665caefabf1dd3e74844 (patch) | |
tree | b7454d6f1b0e425a29ec6a8459386e8e69e1e670 /src/transport/plugin_transport_http_client.c | |
parent | 29fa14da9469c471234a09250cde179ec95066d3 (diff) | |
download | gnunet-063adb71c2a42c2733e0665caefabf1dd3e74844.tar.gz gnunet-063adb71c2a42c2733e0665caefabf1dd3e74844.zip |
Diffstat (limited to 'src/transport/plugin_transport_http_client.c')
-rw-r--r-- | src/transport/plugin_transport_http_client.c | 67 |
1 files changed, 42 insertions, 25 deletions
diff --git a/src/transport/plugin_transport_http_client.c b/src/transport/plugin_transport_http_client.c index ca582332a..f62f7b2dd 100644 --- a/src/transport/plugin_transport_http_client.c +++ b/src/transport/plugin_transport_http_client.c | |||
@@ -126,6 +126,7 @@ client_schedule (struct Plugin *plugin) | |||
126 | gws = GNUNET_NETWORK_fdset_create (); | 126 | gws = GNUNET_NETWORK_fdset_create (); |
127 | GNUNET_NETWORK_fdset_copy_native (grs, &rs, max + 1); | 127 | GNUNET_NETWORK_fdset_copy_native (grs, &rs, max + 1); |
128 | GNUNET_NETWORK_fdset_copy_native (gws, &ws, max + 1); | 128 | GNUNET_NETWORK_fdset_copy_native (gws, &ws, max + 1); |
129 | |||
129 | plugin->client_perform_task = | 130 | plugin->client_perform_task = |
130 | GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT, | 131 | GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT, |
131 | GNUNET_SCHEDULER_NO_TASK, | 132 | GNUNET_SCHEDULER_NO_TASK, |
@@ -179,10 +180,10 @@ client_run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
179 | { | 180 | { |
180 | #if DEBUG_HTTP | 181 | #if DEBUG_HTTP |
181 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, | 182 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, |
182 | "Connection to '%s' %s ended\n", GNUNET_i2s(&s->target), http_plugin_address_to_string(s->plugin, s->addr, s->addrlen)); | 183 | "Connection to '%s' %s ended\n", GNUNET_i2s(&s->target), http_plugin_address_to_string(plugin, s->addr, s->addrlen)); |
183 | #endif | 184 | #endif |
184 | client_disconnect(s); | 185 | client_disconnect(s); |
185 | notify_session_end (s->plugin, &s->target, s); | 186 | notify_session_end (plugin, &s->target, s); |
186 | } | 187 | } |
187 | } | 188 | } |
188 | 189 | ||
@@ -197,7 +198,7 @@ client_disconnect (struct Session *s) | |||
197 | { | 198 | { |
198 | int res = GNUNET_OK; | 199 | int res = GNUNET_OK; |
199 | CURLMcode mret; | 200 | CURLMcode mret; |
200 | struct Plugin *plugin = s->plugin; | 201 | struct Plugin *plugin = plugin; |
201 | 202 | ||
202 | #if DEBUG_HTTP | 203 | #if DEBUG_HTTP |
203 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, | 204 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, |
@@ -205,14 +206,18 @@ client_disconnect (struct Session *s) | |||
205 | GNUNET_i2s (&s->target)); | 206 | GNUNET_i2s (&s->target)); |
206 | #endif | 207 | #endif |
207 | 208 | ||
208 | mret = curl_multi_remove_handle (plugin->client_mh, s->client_put); | 209 | if (s->client_put != NULL) |
209 | if (mret != CURLM_OK) | ||
210 | { | 210 | { |
211 | mret = curl_multi_remove_handle (plugin->client_mh, s->client_put); | ||
212 | if (mret != CURLM_OK) | ||
213 | { | ||
214 | curl_easy_cleanup (s->client_put); | ||
215 | res = GNUNET_SYSERR; | ||
216 | GNUNET_break (0); | ||
217 | } | ||
211 | curl_easy_cleanup (s->client_put); | 218 | curl_easy_cleanup (s->client_put); |
212 | res = GNUNET_SYSERR; | 219 | s->client_put = NULL; |
213 | GNUNET_break (0); | ||
214 | } | 220 | } |
215 | curl_easy_cleanup (s->client_put); | ||
216 | 221 | ||
217 | #if DEBUG_HTTP | 222 | #if DEBUG_HTTP |
218 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, | 223 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, |
@@ -220,15 +225,20 @@ client_disconnect (struct Session *s) | |||
220 | GNUNET_i2s (&s->target)); | 225 | GNUNET_i2s (&s->target)); |
221 | #endif | 226 | #endif |
222 | 227 | ||
223 | mret = curl_multi_remove_handle (plugin->client_mh, s->client_get); | 228 | if (s->client_get != NULL) |
224 | if (mret != CURLM_OK) | ||
225 | { | 229 | { |
230 | mret = curl_multi_remove_handle (plugin->client_mh, s->client_get); | ||
231 | if (mret != CURLM_OK) | ||
232 | { | ||
233 | curl_easy_cleanup (s->client_get); | ||
234 | res = GNUNET_SYSERR; | ||
235 | GNUNET_break (0); | ||
236 | } | ||
226 | curl_easy_cleanup (s->client_get); | 237 | curl_easy_cleanup (s->client_get); |
227 | res = GNUNET_SYSERR; | 238 | s->client_get = NULL; |
228 | GNUNET_break (0); | ||
229 | } | 239 | } |
230 | curl_easy_cleanup (s->client_get); | 240 | |
231 | plugin->cur_connections += 2; | 241 | plugin->cur_connections -= 2; |
232 | 242 | ||
233 | /* Re-schedule since handles have changed */ | 243 | /* Re-schedule since handles have changed */ |
234 | if (plugin->client_perform_task!= GNUNET_SCHEDULER_NO_TASK) | 244 | if (plugin->client_perform_task!= GNUNET_SCHEDULER_NO_TASK) |
@@ -236,7 +246,6 @@ client_disconnect (struct Session *s) | |||
236 | GNUNET_SCHEDULER_cancel (plugin->client_perform_task); | 246 | GNUNET_SCHEDULER_cancel (plugin->client_perform_task); |
237 | plugin->client_perform_task = GNUNET_SCHEDULER_NO_TASK; | 247 | plugin->client_perform_task = GNUNET_SCHEDULER_NO_TASK; |
238 | } | 248 | } |
239 | |||
240 | plugin->client_perform_task = GNUNET_SCHEDULER_add_now(client_run, plugin); | 249 | plugin->client_perform_task = GNUNET_SCHEDULER_add_now(client_run, plugin); |
241 | 250 | ||
242 | return res; | 251 | return res; |
@@ -246,23 +255,24 @@ client_disconnect (struct Session *s) | |||
246 | int | 255 | int |
247 | client_connect (struct Session *s) | 256 | client_connect (struct Session *s) |
248 | { | 257 | { |
258 | struct Plugin *plugin = s->plugin; | ||
249 | int res = GNUNET_OK; | 259 | int res = GNUNET_OK; |
250 | char *url; | 260 | char *url; |
251 | CURLMcode mret; | 261 | CURLMcode mret; |
252 | 262 | ||
253 | #if DEBUG_HTTP | 263 | #if VERBOSE_CLIENT |
254 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, s->plugin->name, | 264 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, |
255 | "Initiating outbound session peer `%s'\n", | 265 | "Initiating outbound session peer `%s'\n", |
256 | GNUNET_i2s (&s->target)); | 266 | GNUNET_i2s (&s->target)); |
257 | #endif | 267 | #endif |
258 | 268 | ||
259 | s->inbound = GNUNET_NO; | 269 | s->inbound = GNUNET_NO; |
260 | 270 | ||
261 | s->plugin->last_tag++; | 271 | plugin->last_tag++; |
262 | /* create url */ | 272 | /* create url */ |
263 | GNUNET_asprintf (&url, "%s%s;%u", http_plugin_address_to_string (s->plugin, s->addr, s->addrlen), GNUNET_h2s_full (&s->plugin->env->my_identity->hashPubKey),s->plugin->last_tag); | 273 | GNUNET_asprintf (&url, "%s%s;%u", http_plugin_address_to_string (plugin, s->addr, s->addrlen), GNUNET_h2s_full (&plugin->env->my_identity->hashPubKey),plugin->last_tag); |
264 | #if 0 | 274 | #if 0 |
265 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, s->plugin->name, | 275 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, |
266 | "URL `%s'\n", | 276 | "URL `%s'\n", |
267 | url); | 277 | url); |
268 | #endif | 278 | #endif |
@@ -329,7 +339,7 @@ client_connect (struct Session *s) | |||
329 | 339 | ||
330 | GNUNET_free (url); | 340 | GNUNET_free (url); |
331 | 341 | ||
332 | mret = curl_multi_add_handle (s->plugin->client_mh, s->client_get); | 342 | mret = curl_multi_add_handle (plugin->client_mh, s->client_get); |
333 | if (mret != CURLM_OK) | 343 | if (mret != CURLM_OK) |
334 | { | 344 | { |
335 | curl_easy_cleanup (s->client_get); | 345 | curl_easy_cleanup (s->client_get); |
@@ -337,10 +347,10 @@ client_connect (struct Session *s) | |||
337 | GNUNET_break (0); | 347 | GNUNET_break (0); |
338 | } | 348 | } |
339 | 349 | ||
340 | mret = curl_multi_add_handle (s->plugin->client_mh, s->client_put); | 350 | mret = curl_multi_add_handle (plugin->client_mh, s->client_put); |
341 | if (mret != CURLM_OK) | 351 | if (mret != CURLM_OK) |
342 | { | 352 | { |
343 | curl_multi_remove_handle (s->plugin->client_mh, s->client_get); | 353 | curl_multi_remove_handle (plugin->client_mh, s->client_get); |
344 | curl_easy_cleanup (s->client_get); | 354 | curl_easy_cleanup (s->client_get); |
345 | curl_easy_cleanup (s->client_put); | 355 | curl_easy_cleanup (s->client_put); |
346 | res = GNUNET_SYSERR; | 356 | res = GNUNET_SYSERR; |
@@ -348,8 +358,15 @@ client_connect (struct Session *s) | |||
348 | } | 358 | } |
349 | 359 | ||
350 | /* Perform connect */ | 360 | /* Perform connect */ |
351 | s->plugin->cur_connections += 2; | 361 | plugin->cur_connections += 2; |
352 | s->plugin->client_perform_task = GNUNET_SCHEDULER_add_now (client_run, s->plugin); | 362 | |
363 | /* Re-schedule since handles have changed */ | ||
364 | if (plugin->client_perform_task!= GNUNET_SCHEDULER_NO_TASK) | ||
365 | { | ||
366 | GNUNET_SCHEDULER_cancel (plugin->client_perform_task); | ||
367 | plugin->client_perform_task = GNUNET_SCHEDULER_NO_TASK; | ||
368 | } | ||
369 | plugin->client_perform_task = GNUNET_SCHEDULER_add_now (client_run, plugin); | ||
353 | 370 | ||
354 | return res; | 371 | return res; |
355 | } | 372 | } |