input/curl: moved code to fill_buffer()

This commit is contained in:
Max Kellermann 2009-10-11 23:09:38 +02:00
parent d6d4de1123
commit 016558093b

View File

@ -282,6 +282,42 @@ input_curl_select(struct input_curl *c)
return ret; return ret;
} }
static bool
fill_buffer(struct input_stream *is)
{
struct input_curl *c = is->data;
CURLMcode mcode = CURLM_CALL_MULTI_PERFORM;
while (!c->eof && g_queue_is_empty(c->buffers)) {
int running_handles;
bool bret;
if (mcode != CURLM_CALL_MULTI_PERFORM) {
/* if we're still here, there is no input yet
- wait for input */
int ret = input_curl_select(c);
if (ret <= 0)
/* no data yet or error */
return false;
}
mcode = curl_multi_perform(c->multi, &running_handles);
if (mcode != CURLM_OK && mcode != CURLM_CALL_MULTI_PERFORM) {
g_warning("curl_multi_perform() failed: %s\n",
curl_multi_strerror(mcode));
c->eof = true;
is->ready = true;
return false;
}
bret = input_curl_multi_info_read(is);
if (!bret)
return false;
}
return true;
}
/** /**
* Mark a part of the buffer object as consumed. * Mark a part of the buffer object as consumed.
*/ */
@ -381,7 +417,7 @@ static size_t
input_curl_read(struct input_stream *is, void *ptr, size_t size) input_curl_read(struct input_stream *is, void *ptr, size_t size)
{ {
struct input_curl *c = is->data; struct input_curl *c = is->data;
CURLMcode mcode = CURLM_CALL_MULTI_PERFORM; bool success;
GQueue *rewind_buffers; GQueue *rewind_buffers;
size_t nbytes = 0; size_t nbytes = 0;
char *dest = ptr; char *dest = ptr;
@ -409,32 +445,9 @@ input_curl_read(struct input_stream *is, void *ptr, size_t size)
/* fill the buffer */ /* fill the buffer */
while (!c->eof && g_queue_is_empty(c->buffers)) { success = fill_buffer(is);
int running_handles; if (!success)
bool bret; return 0;
if (mcode != CURLM_CALL_MULTI_PERFORM) {
/* if we're still here, there is no input yet
- wait for input */
int ret = input_curl_select(c);
if (ret <= 0)
/* no data yet or error */
return 0;
}
mcode = curl_multi_perform(c->multi, &running_handles);
if (mcode != CURLM_OK && mcode != CURLM_CALL_MULTI_PERFORM) {
g_warning("curl_multi_perform() failed: %s\n",
curl_multi_strerror(mcode));
c->eof = true;
is->ready = true;
return 0;
}
bret = input_curl_multi_info_read(is);
if (!bret)
return 0;
}
/* send buffer contents */ /* send buffer contents */