Close connection when a single-dot line is read - sacc - sacc(omys), simple con… | |
git clone git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65… | |
Log | |
Files | |
Refs | |
Tags | |
LICENSE | |
--- | |
commit 17674fcc4257afa53e81fdeab49b21f0f57528c7 | |
parent 34fd4f17068b408353bb6ae1df3eb4a58c259e25 | |
Author: Quentin Rameau <[email protected]> | |
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: | |
M sacc.c | 17 +++++++++++------ | |
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); |