aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/input/curl_input_plugin.c67
1 files changed, 40 insertions, 27 deletions
diff --git a/src/input/curl_input_plugin.c b/src/input/curl_input_plugin.c
index a140556c5..4ed8e5b5b 100644
--- a/src/input/curl_input_plugin.c
+++ b/src/input/curl_input_plugin.c
@@ -282,6 +282,42 @@ input_curl_select(struct input_curl *c)
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.
*/
@@ -381,7 +417,7 @@ static size_t
input_curl_read(struct input_stream *is, void *ptr, size_t size)
{
struct input_curl *c = is->data;
- CURLMcode mcode = CURLM_CALL_MULTI_PERFORM;
+ bool success;
GQueue *rewind_buffers;
size_t nbytes = 0;
char *dest = ptr;
@@ -409,32 +445,9 @@ input_curl_read(struct input_stream *is, void *ptr, size_t size)
/* fill the buffer */
- 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 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;
- }
+ success = fill_buffer(is);
+ if (!success)
+ return 0;
/* send buffer contents */