This is an automated email from the ASF dual-hosted git repository.

GUIDINGLI pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new f14e5f4d282 Documentation/netutils: add comprehensive guide for 
webclient
f14e5f4d282 is described below

commit f14e5f4d2825e5a1c73ee4716a289325e0797a54
Author: Swatantra Yadav <[email protected]>
AuthorDate: Tue Oct 6 23:49:29 2026 +0530

    Documentation/netutils: add comprehensive guide for webclient
    
    Provide a complete documentation page for the webclient network utility
    in Documentation/applications/netutils/webclient/index.rst, replacing
    the previous 7-line placeholder stub.
    
    Includes:
    - Architecture overview (NSH wget engine + programmatic C API)
    - Key features (HTTP/1.0, HTTP/1.1, chunked encoding, pluggable TLS,
      non-blocking I/O, proxy tunneling)
    - Detailed Kconfig configuration table and dependencies
    - NSH wget syntax, options, and real-world usage examples
    - C API reference for simple helpers (wget, wget_post) and the
      context-based API (struct webclient_context)
    - Complete, runnable C application example for file downloads
    
    Addresses #11081
    
    Signed-off-by: Swatantra Yadav <[email protected]>
---
 .../applications/netutils/webclient/index.rst      | 256 ++++++++++++++++++++-
 1 file changed, 252 insertions(+), 4 deletions(-)

diff --git a/Documentation/applications/netutils/webclient/index.rst 
b/Documentation/applications/netutils/webclient/index.rst
index ca0cfb96e5c..bdc0f4b08da 100644
--- a/Documentation/applications/netutils/webclient/index.rst
+++ b/Documentation/applications/netutils/webclient/index.rst
@@ -1,6 +1,254 @@
-============================
-``webclient`` uIP web client
-============================
+=============================
+``webclient`` HTTP Web Client
+=============================
 
-HTTP web client. See ``apps/include/netutils/webclient.h`` for interface 
information.
+Overview
+========
+
+``webclient`` is a lightweight, efficient HTTP/1.0 and HTTP/1.1 client library
+and application utility for Apache NuttX. Designed specifically for embedded 
and
+resource-constrained environments, it provides full-featured HTTP and HTTPS 
client
+capabilities with a minimal memory footprint.
+
+It serves two primary roles in NuttX:
+
+1. **Underlying Engine for NSH ``wget``**: Powers the interactive ``wget`` 
command
+   used in the NuttShell (NSH) to download files, firmware images, and web 
content.
+2. **Programmatic C API**: Provides embedded applications with flexible APIs 
ranging
+   from simple one-shot HTTP GET/POST helpers to an extensible context-based 
API
+   supporting streaming callbacks, custom request/response headers, chunked
+   transfer encoding, non-blocking I/O, proxy tunneling, and pluggable TLS 
(HTTPS).
+
+Key Features
+============
+
+- **HTTP/1.0 and HTTP/1.1 Compliance**: Handles standard HTTP requests, 
response
+  status codes, header parsing, and redirects (301, 302, 307, 308).
+- **Chunked Transfer Encoding**: Seamlessly consumes ``Transfer-Encoding: 
chunked``
+  responses from modern web servers.
+- **Streaming Callback Architecture**: Consumes incoming payload chunks via 
user-provided
+  sink callbacks, avoiding the need to buffer entire response files into RAM.
+- **Pluggable TLS / HTTPS Support**: Abstracted via ``struct 
webclient_tls_ops``, allowing
+  transparent HTTPS operation using TLS engines like mbedTLS or wolfSSL.
+- **Non-Blocking Operation**: Supports asynchronous, event-driven execution 
using
+  ``WEBCLIENT_FLAG_NON_BLOCKING`` and pollable file descriptors. Note that 
hostname
+  resolution (DNS lookup) is currently performed in a blocking manner.
+- **HTTP Proxy & Tunneling**: Supports HTTP CONNECT proxies and tunnel 
establishment
+  for secure enterprise deployments.
+
+Requirements & Dependencies
+===========================
+
+To use ``webclient``, the following network subsystem features must be enabled:
+
+- TCP Networking: ``CONFIG_NET=y`` and ``CONFIG_NET_TCP=y``
+- Socket Options: ``CONFIG_NET_SOCKOPTS=y``
+- DNS Client / Host Resolution: ``CONFIG_LIBC_NETDB=y`` and 
``CONFIG_NETDB_DNSCLIENT=y``
+- Generic URL Parser: ``CONFIG_NETUTILS_NETLIB_GENERICURLPARSER=y``
+- Enable the Library: ``CONFIG_NETUTILS_WEBCLIENT=y``
+
+Configuration Options
+=====================
+
+The behavior of ``webclient`` is configured through Kconfig under
+``Application Configuration -> Network Utilities -> uIP web client``:
+
+.. list-table::
+   :widths: 35 15 50
+   :header-rows: 1
+
+   * - Setting
+     - Default
+     - Description
+   * - ``CONFIG_NETUTILS_WEBCLIENT``
+     - ``n``
+     - Enables the web client library.
+   * - ``CONFIG_NSH_WGET_USERAGENT``
+     - ``NuttX/6.xx.x``
+     - HTTP User-Agent string sent in requests by NSH ``wget``.
+   * - ``CONFIG_WEBCLIENT_TIMEOUT``
+     - ``10``
+     - Socket connect, send, and receive timeout in seconds.
+   * - ``CONFIG_WEBCLIENT_MAXHTTPLINE``
+     - ``200``
+     - Maximum buffer size (in bytes) for a single HTTP header line.
+   * - ``CONFIG_WEBCLIENT_MAXMIMESIZE``
+     - ``32``
+     - Maximum buffer size (in bytes) for parsed MIME type strings.
+   * - ``CONFIG_WEBCLIENT_MAXHOSTNAME``
+     - ``40``
+     - Maximum length of destination hostnames.
+   * - ``CONFIG_WEBCLIENT_MAXFILENAME``
+     - ``100``
+     - Maximum length of request path and filename strings.
+
+NSH ``wget`` Usage
+==================
+
+When ``CONFIG_NETUTILS_WEBCLIENT`` is enabled, the ``wget`` command is 
available
+directly in the NuttShell (unless disabled via ``CONFIG_NSH_DISABLE_WGET``).
+
+Synopsis
+--------
+
+.. code-block:: console
+
+   wget [-o <local-path>] <url>
+
+Options:
+
+- ``-o <local-path>``: Save the downloaded file to the specified local 
filesystem path.
+- ``<url>``: Fully qualified URL (e.g., ``http://192.168.1.1/firmware.bin``).
+
+Examples
+--------
+
+Downloading a configuration or payload file to the local filesystem:
+
+.. code-block:: console
+
+   nsh> wget -o /tmp/config.json http://192.168.1.50:8080/config.json
+   nsh> cat /tmp/config.json
+
+Fetching a remote resource and printing directly to the terminal:
+
+.. code-block:: console
+
+   nsh> wget http://192.168.1.1/status.txt
+
+C API Reference
+===============
+
+The public C interface is declared in ``apps/include/netutils/webclient.h``.
+
+Simple Convenience APIs
+-----------------------
+
+For standard HTTP GET and POST requests where streaming or basic buffering is 
sufficient:
+
+.. code-block:: c
+
+   int wget(FAR const char *url, FAR char *buffer, int buflen,
+            wget_callback_t callback, FAR void *arg);
+
+   int wget_post(FAR const char *url, FAR const char *posts, FAR char *buffer,
+                 int buflen, wget_callback_t callback, FAR void *arg);
+
+- **``url``**: Null-terminated HTTP URL string.
+- **``buffer``**: Caller-allocated scratch buffer used for request headers and 
data chunks.
+- **``buflen``**: Size of the buffer in bytes (typically 512 bytes or larger).
+- **``callback``**: Callback function invoked iteratively as each chunk of 
data arrives.
+- **``arg``**: User context pointer passed directly to the callback.
+
+Context-Based API
+-----------------
+
+For advanced operations (custom headers, non-blocking I/O, streaming request 
bodies,
+or TLS), applications use ``struct webclient_context``:
+
+.. code-block:: c
+
+   void webclient_set_defaults(FAR struct webclient_context *ctx);
+   int webclient_perform(FAR struct webclient_context *ctx);
+   void webclient_abort(FAR struct webclient_context *ctx);
+   void webclient_set_static_body(FAR struct webclient_context *ctx,
+                                  FAR const void *body,
+                                  size_t bodylen);
+
+Key context structure fields:
+
+- ``url``: Target URL.
+- ``method``: HTTP method (``"GET"``, ``"POST"``, ``"PUT"``, ``"DELETE"``, 
etc.).
+- ``sink_callback``: Callback of type ``webclient_sink_callback_t`` to consume 
response body chunks.
+- ``header_callback``: Optional callback of type 
``webclient_header_callback_t`` to intercept headers.
+- ``body_callback``: Callback of type ``webclient_body_callback_t`` for 
streaming request upload bodies.
+- ``tls_ops``: Pointer to ``struct webclient_tls_ops`` for HTTPS connections.
+- ``flags``: Bitwise flags (e.g., ``WEBCLIENT_FLAG_NON_BLOCKING``).
+
+Application Example
+===================
+
+Below is an example showing how an embedded application can fetch a remote file
+and robustly save it to the local filesystem using ``wget()``:
+
+.. code-block:: c
+
+   #include <nuttx/config.h>
+   #include <stdio.h>
+   #include <fcntl.h>
+   #include <unistd.h>
+   #include <errno.h>
+   #include <netutils/webclient.h>
+
+   struct download_ctx_s
+   {
+     int fd;
+     int error;
+   };
+
+   static void file_sink(FAR char **buffer, int offset,
+                         int datend, FAR int *buflen, FAR void *arg)
+   {
+     FAR struct download_ctx_s *ctx = (FAR struct download_ctx_s *)arg;
+     FAR const char *ptr = *buffer + offset;
+     int remaining = datend - offset;
+
+     if (ctx->error != 0 || remaining <= 0)
+       {
+         return;
+       }
+
+     while (remaining > 0)
+       {
+         ssize_t written = write(ctx->fd, ptr, remaining);
+         if (written < 0)
+           {
+             if (errno == EINTR)
+               {
+                 continue;
+               }
+
+             ctx->error = -errno;
+             return;
+           }
+
+         ptr += written;
+         remaining -= written;
+       }
+   }
+
+   int download_file(FAR const char *url, FAR const char *destination)
+   {
+     struct download_ctx_s ctx;
+     char buffer[512];
+     int ret;
+     int cret;
+
+     ctx.fd = open(destination, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+     if (ctx.fd < 0)
+       {
+         return -errno;
+       }
+
+     ctx.error = 0;
+     ret = wget(url, buffer, sizeof(buffer), file_sink, &ctx);
+     cret = close(ctx.fd);
+
+     if (ret < 0)
+       {
+         return ret;
+       }
+
+     if (ctx.error != 0)
+       {
+         return ctx.error;
+       }
+
+     if (cret < 0)
+       {
+         return -errno;
+       }
+
+     return 0;
+   }
 

Reply via email to