Mercurial > pidgin.yaz
comparison libgaim/util.c @ 14960:0c80979077cf
[gaim-migrate @ 17738]
* Patch from Christopher "cuberoot" to fix the repeated, CPU-intensive call loop on url_fetch_recv_cb() which was discussed on gaim-devl with the subject "Yahoo (and maybe others): gaim_util_fetch_url_request() at 100% CPU until complete with repeated EAGAIN". He writes:
"When read() returns 0, that means eof... period. Don't check errno, don't collect $200.
The loop was caused by eof condition when errno had previously been EAGAIN/EWOULDBLOCK. The CPU-bound loop stopped when errno happened to be overwritten.
I also believe trying to use some/part of an HTTP request on ETIMEDOUT to be a mistake so I removed it. Funny enough the read(2) manpage doesn't document ETIMEDOUT as a possible errno, but it is. (see tcp_timer.c and tcp_subr.c in src/sys/netinet)."
This closes Adium Trac ticket #5685.
* Added some passing-NULL-to-printf() safety which has been sitting around in this file locally for a while, waiting for a worthwhile commit to accompany.
committer: Tailor Script <tailor@pidgin.im>
author | Evan Schoenberg <evan.s@dreskin.net> |
---|---|
date | Sat, 11 Nov 2006 20:29:35 +0000 |
parents | e1446f88650c |
children | fee45b614eb7 |
comparison
equal
deleted
inserted
replaced
14959:c9c1ce4a70b6 | 14960:0c80979077cf |
---|---|
3313 got_eof = TRUE; | 3313 got_eof = TRUE; |
3314 break; | 3314 break; |
3315 } | 3315 } |
3316 } | 3316 } |
3317 | 3317 |
3318 if(len <= 0) { | 3318 if(len < 0) { |
3319 if(errno == EAGAIN) { | 3319 if(errno == EAGAIN) { |
3320 return; | 3320 return; |
3321 } else if(errno != ETIMEDOUT) { | |
3322 got_eof = TRUE; | |
3323 } else { | 3321 } else { |
3324 gaim_util_fetch_url_error(gfud, _("Error reading from %s: %s"), | 3322 gaim_util_fetch_url_error(gfud, _("Error reading from %s: %s"), |
3325 gfud->website.address, strerror(errno)); | 3323 gfud->website.address, strerror(errno)); |
3326 return; | 3324 return; |
3327 } | 3325 } |
3328 } | 3326 } |
3329 | 3327 |
3330 if(got_eof) { | 3328 if((len == 0) || got_eof) { |
3331 gfud->webdata = g_realloc(gfud->webdata, gfud->len + 1); | 3329 gfud->webdata = g_realloc(gfud->webdata, gfud->len + 1); |
3332 gfud->webdata[gfud->len] = '\0'; | 3330 gfud->webdata[gfud->len] = '\0'; |
3333 | 3331 |
3334 gfud->callback(gfud, gfud->user_data, gfud->webdata, gfud->len, NULL); | 3332 gfud->callback(gfud, gfud->user_data, gfud->webdata, gfud->len, NULL); |
3335 gaim_util_fetch_url_cancel(gfud); | 3333 gaim_util_fetch_url_cancel(gfud); |
3376 gfud->connect_data = NULL; | 3374 gfud->connect_data = NULL; |
3377 | 3375 |
3378 if (source == -1) | 3376 if (source == -1) |
3379 { | 3377 { |
3380 gaim_util_fetch_url_error(gfud, _("Unable to connect to %s: %s"), | 3378 gaim_util_fetch_url_error(gfud, _("Unable to connect to %s: %s"), |
3381 gfud->website.address, error_message); | 3379 (gfud->website.address ? gfud->website.address : ""), error_message); |
3382 return; | 3380 return; |
3383 } | 3381 } |
3384 | 3382 |
3385 gfud->fd = source; | 3383 gfud->fd = source; |
3386 | 3384 |
3397 "Connection: close\r\n" | 3395 "Connection: close\r\n" |
3398 "User-Agent: %s\r\n" | 3396 "User-Agent: %s\r\n" |
3399 "Accept: */*\r\n" | 3397 "Accept: */*\r\n" |
3400 "Host: %s\r\n\r\n", | 3398 "Host: %s\r\n\r\n", |
3401 (gfud->full ? "" : "/"), | 3399 (gfud->full ? "" : "/"), |
3402 (gfud->full ? gfud->url : gfud->website.page), | 3400 (gfud->full ? (gfud->url ? gfud->url : "") : (gfud->website.page ? gfud->website.page : "")), |
3403 (gfud->http11 ? "1.1" : "1.0"), | 3401 (gfud->http11 ? "1.1" : "1.0"), |
3404 gfud->user_agent, gfud->website.address); | 3402 (gfud->user_agent ? gfud->user_agent : ""), |
3403 (gfud->website.address ? gfud->website.address : "")); | |
3405 } else { | 3404 } else { |
3406 gfud->request = g_strdup_printf( | 3405 gfud->request = g_strdup_printf( |
3407 "GET %s%s HTTP/%s\r\n" | 3406 "GET %s%s HTTP/%s\r\n" |
3408 "Connection: close\r\n" | 3407 "Connection: close\r\n" |
3409 "Accept: */*\r\n" | 3408 "Accept: */*\r\n" |
3410 "Host: %s\r\n\r\n", | 3409 "Host: %s\r\n\r\n", |
3411 (gfud->full ? "" : "/"), | 3410 (gfud->full ? "" : "/"), |
3412 (gfud->full ? gfud->url : gfud->website.page), | 3411 (gfud->full ? (gfud->url ? gfud->url : "") : (gfud->website.page ? gfud->website.page : "")), |
3413 (gfud->http11 ? "1.1" : "1.0"), | 3412 (gfud->http11 ? "1.1" : "1.0"), |
3414 gfud->website.address); | 3413 (gfud->website.address ? gfud->website.address : "")); |
3415 } | 3414 } |
3416 } | 3415 } |
3417 | 3416 |
3418 gaim_debug_misc("util", "Request: '%s'\n", gfud->request); | 3417 gaim_debug_misc("util", "Request: '%s'\n", gfud->request); |
3419 | 3418 |