The webserver/httpd app is currently broken when script support is enabled (CONFIG_NETUTILS_HTTPD_SCRIPT_DISABLE). The root cause has been tracked down to the "Content-length" not being available ahead of time in this case (length of -1 passed to send_headers() ). On the other hand, the server closing the socket does not result in FIN being sent to the browser either (FIN not supported by NuttX yet).
Simple solution: Add support for HTTP Chunked Encoding to webserver/httpd (attached patch).
The attached patch is simple. It adds a configuration option to enable chunked encoding. When enabled, the implementation will auto-detect the cases where content length is not available ahead of time, and will automatically engage chunked encoding transfers.
Without this patch, the browser/client hangs forever, as it is expecting more data. With this patch, the browser displays the content.
Reviewers note: Reviewing the changes I also see that these file did not follow the NuttX codings standard. I ran all files through nuttx/tools/indent.sh, manually reviewed all files for coding style issues. I also changed occurrences of non-standard types u8_t, u16_t, and u32_t to the standard uint8_t, uint16_t, and uint32_t.
FTP: Adds support for IPv6 and fixes various transfer issues
* netutils/ftpd: Fix support for IPv6 FTP server
* netutils/ftpc:Adds support for IPv6 sockets
* ftpc: Must convert port received by EPSV reply to network order
* ftpc: Data socket address for passive connection should be same as server address
* ftpc: Must skip human readable string in EPSV response before scanning for port
* ftpc: Don't send PASS command if USER command was sufficient. ie no password required
* ftpc: Generically handle permanent negative completion in shard ftpc_cmd logic
* ftpc: Minor addresssing fix
* ftpc: Tweak logic for overriding network debugging output
* FTP: Adds option for setting stack size of various threads in FTPD and FTPC
* netutils/ftpd: Fixes build error setting IPv4 address. sin_addr => sin_addr.s_addr
* netutils/ftpd: Protects against partial write returns by looping in that case
Approved-by: Gregory Nutt <gnutt@nuttx.org>
apps/netutils/netlib: netlib_ipv[4|6]adaptor() will now use the new routing table interfaces if they are available: If the desination IP address does not correspond to the network served by any device, then the address of the router that should get us to the correct sub-net is is determined. Then the network adaptor that can communicate with the that router has the IP address that will returned.
apps/netutils/netlib: Add new utilities netlib_ipv[4|6]router() that can be used to determine the IP address of a router that would be used some some destination IP address that is not locally accessible.
apps/netutils/netlib: Add helpers for reading the routing table: netlib_read_ipv4route() and netlib_read_ipv6route()