commit 17674fcc4257afa53e81fdeab49b21f0f57528c7
parent 34fd4f17068b408353bb6ae1df3eb4a58c259e25
Author: Quentin Rameau <quinq@fifth.space>
Date:   Mon,  8 Feb 2021 22:59:52 +0100
Close connection when a single-dot line is read
This approach instead of always warning that something might have been
wrong in case the message isn't terminated single-dot line is more
forgiving as not all gopher server follow that aspect of the standard.
Diffstat:
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/sacc.c b/sacc.c
@@ -377,8 +377,6 @@ molddiritem(char *raw)
 		s = nl;
 		nl = p+1;
 	}
-	if (!strcmp(s, ".\r\n") || !strcmp(s, ".\n"))
-		--nitems;
 	if (!nitems) {
 		diag("Couldn't parse dir item");
 		return NULL;
@@ -421,6 +419,17 @@ getrawitem(int sock)
 	do {
 		bs -= n;
 		buf += n;
+
+		if (buf - raw >= 5) {
+			if (strncmp(buf-5, "\r\n.\r\n", 5) == 0) {
+				buf[-3] = '\0';
+				break;
+			}
+		} else if (buf - raw == 3 && strncmp(buf-3, ".\r\n", 3)) {
+			buf[-3] = '\0';
+			break;
+		}
+
 		if (bs < 1) {
 			raw = xreallocarray(raw, ++bn, BUFSIZ);
 			buf = raw + (bn-1) * BUFSIZ;
@@ -611,10 +620,6 @@ fetchitem(Item *item)
 	if (raw == NULL || !*raw) {
 		diag("Empty response from server");
 		clear(&raw);
-	} else if ((r = strrchr(raw, '.')) == NULL || strcmp(r, ".\r\n")) {
-		diag("Incomplete response from server");
-	} else {
-		*r = '\0';
 	}
 
 	return ((item->raw = raw) != NULL);