diff --git a/src/input/plugins/CurlInputPlugin.cxx b/src/input/plugins/CurlInputPlugin.cxx
index fcee9135d..c685b3fee 100644
--- a/src/input/plugins/CurlInputPlugin.cxx
+++ b/src/input/plugins/CurlInputPlugin.cxx
@@ -414,7 +414,7 @@ input_curl_init(EventLoop &event_loop, const ConfigBlock &block)
 				  std::chrono::seconds{1},
 				  default_connection_timeout));
 
-	verbose = block.GetBlockValue("verbose",verbose);
+	verbose = block.GetBlockValue("verbose", verbose);
 
 	low_speed_limit = block.GetBlockValue("low_speed_limit", default_low_speed_limit);
 
@@ -436,6 +436,31 @@ input_curl_finish() noexcept
 	http_200_aliases = nullptr;
 }
 
+/**
+ * CURLOPT_DEBUGFUNCTION
+ */
+static int
+CurlDebugToLog(CURL *handle, curl_infotype type, char *data, size_t size, void *user)
+{
+	(void)handle;
+	(void)user;
+
+	switch(type) {
+		case CURLINFO_TEXT:
+			Log(LogLevel::DEBUG, curl_domain, std::string_view{data, size});
+			break;
+		case CURLINFO_HEADER_OUT:
+			FmtDebug(curl_domain, "Header out: {}", std::string_view{data, size});
+			break;
+		case CURLINFO_HEADER_IN:
+			FmtDebug(curl_domain, "Header in: {}", std::string_view{data, size});
+			break;
+		default:
+			break;
+	}
+	return 0;
+}
+
 template<typename I>
 inline
 CurlInputStream::CurlInputStream(EventLoop &event_loop, std::string_view _url,
@@ -513,6 +538,8 @@ CreateEasy(const char *url, struct curl_slist *headers)
 
 	easy.SetRequestHeaders(headers);
 
+	easy.SetOption(CURLOPT_DEBUGFUNCTION, CurlDebugToLog);
+
 	return easy;
 }