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