ref: 27cba0188575b3663d7e4873c99adfa489213d5a
parent: 894d1d534e687fac3dae6cc64db07ad07f55a891
	author: Julien Blanchard <julien@typed-hole.org>
	date: Thu Dec 10 12:03:44 EST 2020
	
Better status codes handling
--- a/castor.c
+++ b/castor.c
@@ -190,16 +190,25 @@
}
void
-handle_status(char *status, Response *r)
+parse_status(char *status, Response *r)
 {int code;
- char *meta;
- code = atoi(strtok(status, " \t"));
- if(code == 0)
-		message("STATUS: %s\n", status);- meta = strtok(NULL, "\n");
- r->status = code;
- r->meta = cleanup(meta);
+ char *meta, *s;
+
+	if(status == nil){+		message("Failed to read response (missing crlf?)", status);+ return;
+ }
+	if((s = strtok(status, " \t")) != nil){+ code = atoi(s);
+		if(code == 0){+			message("Invalid status received: %s", status);+ return;
+ }
+ meta = strtok(NULL, "\r\n");
+ r->status = code;
+ r->meta = cleanup(meta);
+ }
}
void
@@ -230,7 +239,7 @@
}
/* Headers */
 		if(strbeg(line, "#") == 0){- plrtstr(&c->text, 1000000, 8, 0, font, strdup(cleanup(base)), PL_SEL, 0);
+ plrtstr(&c->text, 1000000, 8, 0, font, strdup(cleanup(base)), PL_HEAD, 0);
break;
} /* Small lines */
 		if((length <= width)){@@ -363,10 +372,17 @@
fprint(fd, "%s\r\n", url->raw);
Binit(&body, fd, OREAD);
- char *status = Brdstr(&body, '\n', '0');
- handle_status(status, r);
+ char *status = Brdstr(&body, '\n', 0);
+ parse_status(status, r);
-	if(r->status == 20){+	switch(r->status){+ case 10:
+		message("Input! %s", r->meta);+ break;
+ case 11:
+		message("Sensitive input! %s", r->meta);+ break;
+ case 20:
c->url = url;
set_current_base_url(base_url(url));
@@ -396,9 +412,56 @@
show(c);
}
-	}else if(r->status == 31){- Url *redirect = urlparse(nil, r->meta);
- gemini_get(redirect);
+
+ break;
+ case 30:
+ gemini_get(urlparse(nil, r->meta));
+ break;
+ case 31:
+ gemini_get(urlparse(nil, r->meta));
+ break;
+ case 40:
+		message("Temporary failure, please try again later!");+ break;
+ case 41:
+		message("Server unavailable!");+ break;
+ case 42:
+		message("CGI error!");+ break;
+ case 43:
+		message("Proxy error!");+ break;
+ case 44:
+		message("Slow down!");+ break;
+ case 50:
+		message("Permanent failure!");+ break;
+ case 51:
+		message("Not found!");+ break;
+ case 52:
+		message("Gone!");+ break;
+ case 53:
+		message("Proxy request refused!");+ break;
+ case 59:
+		message("Bad request!");+ break;
+ case 60:
+		message("Client certificate required!");+ break;
+ case 61:
+		message("Certificate not authorised!");+ break;
+ case 62:
+		message("Certificate not valid!");+ break;
+ //default:
+	//	message("Unknown status code %d!", status);+ // break;
}
}
--
⑨