Re: [PATCH v4 4/8] test-http-server: add HTTP error response function
- From
Victoria Dye <vdye@github.com>
- Date
- Dec 14, 2022, 23:17 UTC
- Message-ID
- <7b7d1059-cecf-744d-6927-b41963b9e5a8@github.com>
- In-Reply-To
- <98dd286db7c95b6401167c4a9b5e2336843d2629.1670880984.git.gitgitgadget@gmail.com>
Matthew John Cheetham via GitGitGadget wrote:
Show 43 quoted lines
> +static enum worker_result send_http_error(
> + int fd,
> + int http_code, const char *http_code_name,
> + int retry_after_seconds, struct string_list *response_headers,
> + enum worker_result wr_in)
> +{
> + struct strbuf response_header = STRBUF_INIT;
> + struct strbuf response_content = STRBUF_INIT;
> + struct string_list_item *h;
> + enum worker_result wr;
> +
> + strbuf_addf(&response_content, "Error: %d %s\r\n",
> + http_code, http_code_name);
> + if (retry_after_seconds > 0)
> + strbuf_addf(&response_content, "Retry-After: %d\r\n",
> + retry_after_seconds);
> +
> + strbuf_addf (&response_header, "HTTP/1.1 %d %s\r\n", http_code, http_code_name);
> + strbuf_addstr(&response_header, "Cache-Control: private\r\n");
> + strbuf_addstr(&response_header, "Content-Type: text/plain\r\n");
> + strbuf_addf (&response_header, "Content-Length: %d\r\n", (int)response_content.len);
> + if (retry_after_seconds > 0)
> + strbuf_addf(&response_header, "Retry-After: %d\r\n", retry_after_seconds);
> + strbuf_addf( &response_header, "Server: test-http-server/%s\r\n", git_version_string);
> + strbuf_addf( &response_header, "Date: %s\r\n", show_date(time(NULL), 0, DATE_MODE(RFC2822)));
> + if (response_headers)
> + for_each_string_list_item(h, response_headers)
> + strbuf_addf(&response_header, "%s\r\n", h->string);
> + strbuf_addstr(&response_header, "\r\n");
> +
> + if (write_in_full(fd, response_header.buf, response_header.len) < 0) {
> + logerror("unable to write response header");
> + wr = WR_IO_ERROR;
> + goto done;
> + }
> +
> + if (write_in_full(fd, response_content.buf, response_content.len) < 0) {
> + logerror("unable to write response content body");
> + wr = WR_IO_ERROR;
> + goto done;
> + }
> +
> + wr = wr_in;By setting this here, if there's a 'goto done' added sometime in the future that doesn't explicitly set 'wr' first, it'll trigger a compiler error. That's good for a case like this, where we don't want to assume a "default" for 'wr' before handling it.
Show 25 quoted lines
> +
> +done:
> + strbuf_release(&response_header);
> + strbuf_release(&response_content);
> +
> + return wr;
> +}
> +
> static enum worker_result worker(void)
> {
> - const char *response = "HTTP/1.1 501 Not Implemented\r\n";
> char *client_addr = getenv("REMOTE_ADDR");
> char *client_port = getenv("REMOTE_PORT");
> enum worker_result wr = WR_OK;
> @@ -110,11 +160,8 @@ static enum worker_result worker(void)
> set_keep_alive(0);
>
> while (1) {
> - if (write_in_full(1, response, strlen(response)) < 0) {
> - logerror("unable to write response");
> - wr = WR_IO_ERROR;
> - }
> -
> + wr = send_http_error(1, 501, "Not Implemented", -1, NULL,
> + WR_OK | WR_HANGUP);This is a nice incremental improvement on the original hardcoded response.
> if (wr & WR_STOP_THE_MUSIC) > break; > }