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;
> 

Reply via email to