Hi Marek,

On 29/01/2026 01:23, Marek Vasut wrote:
> Currently, the LWIP wget command prints excessive amount of progress
> indicator '#' for very long file downloads,

So true! ;-)

> limit this to one line
> that scales according to transfer size.
> 
> The HTTP server does report the size of the entire file in protocol
> headers, which are received before the actual data transfer. Cache
> this information and use it to adaptively print progress indicator
> '#' until it fills one entire line worth of '#', which indicates the
> transfer has completed. This way, long transfers don't print pages of
> '#', but every transfer will print exactly one line worth of '#'. The
> algorithm for '#' printing is the same as TFTP tsize one.

That's not one line strictly speaking, it is 50 characters.
Like I suggested re. your TFTP patch, perhaps a percent-based format
would be better?

0%....10%....20%... etc.

In any case:

Acked-by: Jerome Forissier <[email protected]>

Thanks,
-- 
Jerome

> 
> Signed-off-by: Marek Vasut <[email protected]>
> ---
> Cc: Ilias Apalodimas <[email protected]>
> Cc: Jerome Forissier <[email protected]>
> Cc: Joe Hershberger <[email protected]>
> Cc: Ramon Fried <[email protected]>
> Cc: Sughosh Ganu <[email protected]>
> Cc: Tim Harvey <[email protected]>
> Cc: Tom Rini <[email protected]>
> Cc: [email protected]
> ---
>  net/lwip/wget.c | 27 +++++++++++++++++++++++----
>  1 file changed, 23 insertions(+), 4 deletions(-)
> 
> diff --git a/net/lwip/wget.c b/net/lwip/wget.c
> index 55bd2b72e26..008f3b395e7 100644
> --- a/net/lwip/wget.c
> +++ b/net/lwip/wget.c
> @@ -37,6 +37,8 @@ struct wget_ctx {
>       ulong size;
>       ulong prevsize;
>       ulong start_time;
> +     ulong content_len;
> +     ulong hash_count;
>       enum done_state done;
>  };
>  
> @@ -152,6 +154,7 @@ static int store_block(struct wget_ctx *ctx, void *src, 
> u16_t len)
>  {
>       ulong store_addr = ctx->daddr;
>       uchar *ptr;
> +     ulong pos;
>  
>       /* Avoid overflow */
>       if (wget_info->buffer_size && wget_info->buffer_size < ctx->size + len)
> @@ -174,10 +177,12 @@ static int store_block(struct wget_ctx *ctx, void *src, 
> u16_t len)
>  
>       ctx->daddr += len;
>       ctx->size += len;
> -     if (ctx->size - ctx->prevsize > PROGRESS_PRINT_STEP_BYTES) {
> -             if (!wget_info->silent)
> -                     printf("#");
> -             ctx->prevsize = ctx->size;
> +
> +     pos = clamp(ctx->size, 0UL, ctx->content_len);
> +
> +     while (ctx->hash_count < pos * 50 / ctx->content_len) {
> +             putc('#');
> +             ctx->hash_count++;
>       }
>  
>       return 0;
> @@ -234,6 +239,14 @@ static void httpc_result_cb(void *arg, httpc_result_t 
> httpc_result,
>               return;
>       }
>  
> +     /* Print hash marks for the last packet received */
> +     while (ctx->hash_count < 49) {
> +             putc('#');
> +             ctx->hash_count++;
> +     }
> +     puts("  ");
> +     print_size(ctx->content_len, "");
> +
>       elapsed = get_timer(ctx->start_time);
>       if (!elapsed)
>               elapsed = 1;
> @@ -263,11 +276,15 @@ static void httpc_result_cb(void *arg, httpc_result_t 
> httpc_result,
>  static err_t httpc_headers_done_cb(httpc_state_t *connection, void *arg, 
> struct pbuf *hdr,
>                                  u16_t hdr_len, u32_t content_len)
>  {
> +     struct wget_ctx *ctx = arg;
> +
>       wget_lwip_fill_info(hdr, hdr_len, content_len);
>  
>       if (wget_info->check_buffer_size && (ulong)content_len > 
> wget_info->buffer_size)
>               return ERR_BUF;
>  
> +     ctx->content_len = content_len;
> +
>       return ERR_OK;
>  }
>  
> @@ -294,6 +311,8 @@ int wget_do_request(ulong dst_addr, char *uri)
>       ctx.size = 0;
>       ctx.prevsize = 0;
>       ctx.start_time = 0;
> +     ctx.content_len = 0;
> +     ctx.hash_count = 0;
>  
>       if (parse_url(uri, ctx.server_name, &ctx.port, &path, &is_https))
>               return CMD_RET_USAGE;

Reply via email to