Claudio Jeker([email protected]) on 2021.04.13 14:14:38 +0200:
> This is another minor cleanup. It makes http_done() similar to http_fail()
> and by taking all the arguments (which would allow it to be called after
> the http connection was removed) and it also no longer alters the http
> state.
>
> At the same time move some common code between http_connect() and
> http_finish_connect() into a new function.
>
> OK?
reads ok benno@
With a bit more shuffeling, you can get this closer to relayd ;) /s
> --
> :wq Claudio
>
> Index: http.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/http.c,v
> retrieving revision 1.27
> diff -u -p -r1.27 http.c
> --- http.c 9 Apr 2021 06:52:50 -0000 1.27
> +++ http.c 13 Apr 2021 12:07:06 -0000
> @@ -259,17 +259,15 @@ http_resolv(struct http_connection *conn
> }
>
> static void
> -http_done(struct http_connection *conn, enum http_result res)
> +http_done(size_t id, enum http_result res, const char *last_modified)
> {
> struct ibuf *b;
>
> - conn->state = STATE_DONE;
> -
> if ((b = ibuf_dynamic(64, UINT_MAX)) == NULL)
> err(1, NULL);
> - io_simple_buffer(b, &conn->id, sizeof(conn->id));
> + io_simple_buffer(b, &id, sizeof(id));
> io_simple_buffer(b, &res, sizeof(res));
> - io_str_buffer(b, conn->last_modified);
> + io_str_buffer(b, last_modified);
> ibuf_close(&msgq, b);
> }
>
> @@ -406,6 +404,43 @@ http_new(size_t id, char *uri, char *mod
> }
>
> static int
> +http_connect_done(struct http_connection *conn)
> +{
> + freeaddrinfo(conn->res0);
> + conn->res0 = NULL;
> + conn->res = NULL;
> +
> +#if 0
> + /* TODO proxy connect */
> + if (proxyenv)
> + proxy_connect(conn->fd, sslhost, proxy_credentials); */
> +#endif
> +
> + return 0;
> +}
> +
> +static int
> +http_finish_connect(struct http_connection *conn)
> +{
> + int error = 0;
> + socklen_t len;
> +
> + len = sizeof(error);
> + if (getsockopt(conn->fd, SOL_SOCKET, SO_ERROR, &error, &len) == -1) {
> + warn("%s: getsockopt SO_ERROR", http_info(conn->url));
> + /* connection will be closed by http_connect() */
> + return -1;
> + }
> + if (error != 0) {
> + errno = error;
> + warn("%s: connect", http_info(conn->url));
> + return -1;
> + }
> +
> + return http_connect_done(conn);
> +}
> +
> +static int
> http_connect(struct http_connection *conn)
> {
> const char *cause = NULL;
> @@ -472,47 +507,7 @@ http_connect(struct http_connection *con
> return -1;
> }
>
> - freeaddrinfo(conn->res0);
> - conn->res0 = NULL;
> - conn->res = NULL;
> -
> -#if 0
> - /* TODO proxy connect */
> - if (proxyenv)
> - proxy_connect(conn->fd, sslhost, proxy_credentials); */
> -#endif
> - return 0;
> -}
> -
> -static int
> -http_finish_connect(struct http_connection *conn)
> -{
> - int error = 0;
> - socklen_t len;
> -
> - len = sizeof(error);
> - if (getsockopt(conn->fd, SOL_SOCKET, SO_ERROR, &error, &len) == -1) {
> - warn("%s: getsockopt SO_ERROR", http_info(conn->url));
> - /* connection will be closed by http_connect() */
> - return -1;
> - }
> - if (error != 0) {
> - errno = error;
> - warn("%s: connect", http_info(conn->url));
> - return -1;
> - }
> -
> - freeaddrinfo(conn->res0);
> - conn->res0 = NULL;
> - conn->res = NULL;
> -
> -#if 0
> - /* TODO proxy connect */
> - if (proxyenv)
> - proxy_connect(conn->fd, sslhost, proxy_credentials); */
> -#endif
> -
> - return 0;
> + return http_connect_done(conn);
> }
>
> static int
> @@ -838,7 +833,8 @@ http_parse_chunked(struct http_connectio
> conn->iosz = chunksize;
>
> if (conn->iosz == 0) {
> - http_done(conn, HTTP_OK);
> + http_done(conn->id, HTTP_OK, conn->last_modified);
> + conn->state = STATE_DONE;
> return 0;
> }
>
> @@ -985,7 +981,8 @@ data_write(struct http_connection *conn)
>
> /* check if regular file transfer is finished */
> if (!conn->chunked && conn->iosz == 0) {
> - http_done(conn, HTTP_OK);
> + http_done(conn->id, HTTP_OK, conn->last_modified);
> + conn->state = STATE_DONE;
> return 0;
> }
>
> @@ -1088,9 +1085,12 @@ http_nextstep(struct http_connection *co
> conn->state = STATE_RESPONSE_DATA;
> } else {
> if (conn->status == 304)
> - http_done(conn, HTTP_NOT_MOD);
> + http_done(conn->id, HTTP_NOT_MOD,
> + conn->last_modified);
> else
> - http_done(conn, HTTP_FAILED);
> + http_done(conn->id, HTTP_FAILED,
> + conn->last_modified);
> + conn->state = STATE_DONE;
> return http_close(conn);
> }
> return WANT_POLLIN;
>