From d6247902eca44aa45f92ac095397738f7f633283 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Sat, 23 Nov 2013 11:59:32 +0100
Subject: [PATCH] input/curl: work around stream resume bug (fixed in libcurl
 7.32.0)

---
 NEWS                          |  2 ++
 src/input/CurlInputPlugin.cxx | 17 +++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/NEWS b/NEWS
index 51a0437ed..f9ce5f45d 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,8 @@ ver 0.18.5 (20??/??/??)
 * database
   - proxy: auto-reload statistics
   - proxy: provide "db_update" in "stats" response
+* input
+  - curl: work around stream resume bug (fixed in libcurl 7.32.0)
 * decoder
   - fluidsynth: auto-detect by default
 * clip 24 bit data from libsamplerate
diff --git a/src/input/CurlInputPlugin.cxx b/src/input/CurlInputPlugin.cxx
index b51fb99ac..b78545951 100644
--- a/src/input/CurlInputPlugin.cxx
+++ b/src/input/CurlInputPlugin.cxx
@@ -273,6 +273,16 @@ public:
 		SocketAction(CURL_SOCKET_TIMEOUT, 0);
 	}
 
+	/**
+	 * This is a kludge to allow pausing/resuming a stream with
+	 * libcurl < 7.32.0.  Read the curl_easy_pause manpage for
+	 * more information.
+	 */
+	void ResumeSockets() {
+		int running_handles;
+		curl_multi_socket_all(multi, &running_handles);
+	}
+
 private:
 	static int TimerFunction(CURLM *multi, long timeout_ms, void *userp);
 
@@ -335,6 +345,13 @@ input_curl_resume(struct input_curl *c)
 	if (c->paused) {
 		c->paused = false;
 		curl_easy_pause(c->easy, CURLPAUSE_CONT);
+
+		if (curl_version_num < 0x072000)
+			/* libcurl older than 7.32.0 does not update
+			   its sockets after curl_easy_pause(); force
+			   libcurl to do it now */
+			curl_multi->ResumeSockets();
+
 		curl_multi->InvalidateSockets();
 	}
 }