summary refs log tree commit diff
path: root/bin
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-09-12 02:35:44 -0400
committerJune McEnroe <june@causal.agency>2019-09-12 02:35:44 -0400
commitb46e8bb966e559bb8ac0cd9d514d19a97d969566 (patch)
treee237d897b589e5a0c1b9b4490057401d55a5d2db /bin
parentAdd title -v flag (diff)
downloadsrc-b46e8bb966e559bb8ac0cd9d514d19a97d969566.tar.gz
src-b46e8bb966e559bb8ac0cd9d514d19a97d969566.zip
Consume entire body
Aborting the request and leaving data around may be causing intermittent
errors. Just discard the rest of the data.
Diffstat (limited to 'bin')
-rw-r--r--bin/title.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/bin/title.c b/bin/title.c
index affc3ceb..11cb9fb7 100644
--- a/bin/title.c
+++ b/bin/title.c
@@ -82,6 +82,7 @@ static void showTitle(const char *title) {
 }
 
 static CURL *curl;
+static bool title;
 static struct {
 	char buf[8192];
 	size_t len;
@@ -93,11 +94,10 @@ static regex_t TitleRegex;
 
 static size_t handleBody(char *buf, size_t size, size_t nitems, void *user) {
 	(void)user;
-
 	size_t len = size * nitems;
 	size_t cap = sizeof(body.buf) - body.len - 1;
 	size_t new = (len < cap ? len : cap);
-	if (!new) return 0;
+	if (title || !new) return len;
 
 	memcpy(&body.buf[body.len], buf, new);
 	body.len += new;
@@ -107,7 +107,9 @@ static size_t handleBody(char *buf, size_t size, size_t nitems, void *user) {
 	if (regexec(&TitleRegex, body.buf, 2, match, 0)) return len;
 	body.buf[match[1].rm_eo] = '\0';
 	showTitle(&body.buf[match[1].rm_so]);
-	return 0;
+	title = true;
+
+	return len;
 }
 
 static CURLcode fetchTitle(const char *url) {
@@ -124,9 +126,9 @@ static CURLcode fetchTitle(const char *url) {
 	if (!type || strncmp(type, "text/html", 9)) return CURLE_OK;
 
 	body.len = 0;
+	title = false;
 	curl_easy_setopt(curl, CURLOPT_NOBODY, 0L);
 	code = curl_easy_perform(curl);
-	if (code == CURLE_WRITE_ERROR) return CURLE_OK;
 	return code;
 }