From 19cc7acb24a1bb402ef3260efa2b64b9357b746a Mon Sep 17 00:00:00 2001 From: Andy Green Date: Fri, 3 Mar 2017 12:38:10 +0800 Subject: [PATCH] fops-zip --- CMakeLists.txt | 3 +- README.coding.md | 76 +++- lib/context.c | 46 ++- lib/fops-zip.c | 667 ++++++++++++++++++++++++++++++++ lib/junzip.c | 267 ------------- lib/lejp-conf.c | 3 +- lib/libev.c | 2 +- lib/libwebsockets.c | 115 ++++-- lib/libwebsockets.h | 153 ++++++-- lib/lws-plat-esp32.c | 18 +- lib/lws-plat-optee.c | 5 +- lib/lws-plat-unix.c | 37 +- lib/lws-plat-win.c | 18 +- lib/output.c | 20 +- lib/private-libwebsockets.h | 61 +-- lib/server.c | 117 ++++-- test-server/candide.zip | Bin 0 -> 211764 bytes test-server/test-server-http.c | 13 +- test-server/test-server-libev.c | 10 +- test-server/test-server-v2.0.c | 26 +- test-server/test-server.c | 13 +- 21 files changed, 1180 insertions(+), 490 deletions(-) create mode 100644 lib/fops-zip.c delete mode 100644 lib/junzip.c create mode 100644 test-server/candide.zip diff --git a/CMakeLists.txt b/CMakeLists.txt index 6429374b..b2d3c03f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -655,7 +655,7 @@ endif() if (LWS_WITH_ZIP_FOPS) list(APPEND SOURCES - lib/junzip.c) + lib/fops-zip.c) endif() # Add helper files for Windows. @@ -1174,6 +1174,7 @@ if (NOT LWS_WITHOUT_TESTAPPS) set(TEST_SERVER_DATA "${PROJECT_SOURCE_DIR}/test-server/favicon.ico" "${PROJECT_SOURCE_DIR}/test-server/leaf.jpg" + "${PROJECT_SOURCE_DIR}/test-server/candide.zip" "${PROJECT_SOURCE_DIR}/test-server/libwebsockets.org-logo.png" "${PROJECT_SOURCE_DIR}/test-server/lws-common.js" "${PROJECT_SOURCE_DIR}/test-server/test.html") diff --git a/README.coding.md b/README.coding.md index 342aa3de..15d4c4a9 100644 --- a/README.coding.md +++ b/README.coding.md @@ -120,6 +120,34 @@ the send pipe on the connection is choked but no ack will ever come, so the dead connection will never become writeable. To cover that, you can use TCP keepalives (see later in this document) or pings. +@section gzip Serving from inside a zip file + +Lws now supports serving gzipped files from inside a zip container. Thanks to +Per Bothner for contributing the code. + +This has the advtantage that if the client can accept GZIP encoding, lws can +simply send the gzip-compressed file from inside the zip file with no further +processing, saving time and bandwidth. + +In the case the client can't understand gzip compression, lws automatically +decompressed the file and sends it normally. + +Clients with limited storage and RAM will find this useful; the memory needed +for the inflate case is constrained so that only one input buffer at a time +is ever in memory. + +To use this feature, ensure LWS_WITH_ZIP_FOPS is enabled at CMake (it is by +default). + +`libwebsockets-test-server-v2.0` includes a mount using this technology +already, run that test server and navigate to http://localhost:7681/ziptest/candide.html + +This will serve the book Candide in html, together with two jpgs, all from +inside a .zip file in /usr/[local/]share-libwebsockets-test-server/candide.zip + +Usage is otherwise automatic, if you arrange a mount that points to the zipfile, +eg, "/ziptest" -> "mypath/test.zip", then URLs like `/ziptest/index.html` will be +servied from `index.html` inside `mypath/test.zip` @section frags Fragmented messages @@ -347,30 +375,51 @@ and then can use helpers to also leverage these platform-independent file handling apis ``` - static inline lws_fop_fd_t + lws_fop_fd_t `lws_plat_file_open`(struct lws_plat_file_ops *fops, const char *filename, - lws_filepos_t *filelen, lws_fop_flags_t *flags) - static inline int + lws_fop_flags_t *flags) + int `lws_plat_file_close`(lws_fop_fd_t fop_fd) - static inline unsigned long + unsigned long `lws_plat_file_seek_cur`(lws_fop_fd_t fop_fd, lws_fileofs_t offset) - static inline int + int `lws_plat_file_read`(lws_fop_fd_t fop_fd, lws_filepos_t *amount, uint8_t *buf, lws_filepos_t len) - static inline int + int `lws_plat_file_write`(lws_fop_fd_t fop_fd, lws_filepos_t *amount, uint8_t *buf, lws_filepos_t len ) ``` +Generic helpers are provided which provide access to generic fops information or +call through to the above fops + +``` +lws_filepos_t +lws_vfs_tell(lws_fop_fd_t fop_fd); + +lws_filepos_t +lws_vfs_get_length(lws_fop_fd_t fop_fd); + +uint32_t +lws_vfs_get_mod_time(lws_fop_fd_t fop_fd); + +lws_fileofs_t +lws_vfs_file_seek_set(lws_fop_fd_t fop_fd, lws_fileofs_t offset); + +lws_fileofs_t +lws_vfs_file_seek_end(lws_fop_fd_t fop_fd, lws_fileofs_t offset); +``` + + The user code can also override or subclass the file operations, to either wrap or replace them. An example is shown in test server. ### Changes from v2.1 and before fops -There are three changes: +There are several changes: 1) Pre-2.2 fops directly used platform file descriptors. Current fops returns and accepts a wrapper type lws_fop_fd_t which is a pointer to a malloc'd struct containing information specific to the filesystem implementation. @@ -378,6 +427,19 @@ There are three changes: 3) Everything is wrapped in typedefs. See lws-plat-unix.c for examples of how to implement. +4) Position in the file, File Length, and a copy of Flags left after open are now generically held in the fop_fd. +VFS implementation must set and manage this generic information now. See the implementations in lws-plat-unix.c for +examples. + +5) The file length is no longer set at a pointer provided by the open() fop. The api `lws_vfs_get_length()` is provided to +get the file length after open. + +6) If your file namespace is virtual, ie, is not reachable by platform fops directly, you must set LWS_FOP_FLAG_VIRTUAL +on the flags during open. + +7) There is an optional `mod_time` uint32_t member in the generic fop_fd. If you are able to set it during open, you +should indicate it by setting `LWS_FOP_FLAG_MOD_TIME_VALID` on the flags. + @section ecdh ECDH Support ECDH Certs are now supported. Enable the CMake option diff --git a/lib/context.c b/lib/context.c index 668d16b9..024cc815 100644 --- a/lib/context.c +++ b/lib/context.c @@ -150,7 +150,8 @@ lws_protocol_init(struct lws_context *context) for (n = 0; n < vh->count_protocols; n++) { wsi.protocol = &vh->protocols[n]; - + if (!vh->protocols[n].name) + continue; pvo = lws_vhost_protocol_options(vh, vh->protocols[n].name); if (pvo) { @@ -403,7 +404,11 @@ lws_create_vhost(struct lws_context *context, } #endif - if (info->options & LWS_SERVER_OPTION_EXPLICIT_VHOSTS) + if ( +#ifdef LWS_WITH_PLUGINS + (context->plugin_list) || +#endif + info->options & LWS_SERVER_OPTION_EXPLICIT_VHOSTS) vh->protocols = lwsp; else { vh->protocols = info->protocols; @@ -571,6 +576,7 @@ LWS_VISIBLE struct lws_context * lws_create_context(struct lws_context_creation_info *info) { struct lws_context *context = NULL; + struct lws_plat_file_ops *prev; #ifndef LWS_NO_DAEMONIZE int pid_daemon = get_daemonize_pid(); #endif @@ -621,20 +627,34 @@ lws_create_context(struct lws_context_creation_info *info) /* default to just the platform fops implementation */ - context->fops_default[0].open = _lws_plat_file_open; - context->fops_default[0].close = _lws_plat_file_close; - context->fops_default[0].seek_cur = _lws_plat_file_seek_cur; - context->fops_default[0].read = _lws_plat_file_read; - context->fops_default[0].write = _lws_plat_file_write; - context->fops_default[0].path_prefix = "/"; + context->fops_platform.open = _lws_plat_file_open; + context->fops_platform.close = _lws_plat_file_close; + context->fops_platform.seek_cur = _lws_plat_file_seek_cur; + context->fops_platform.read = _lws_plat_file_read; + context->fops_platform.write = _lws_plat_file_write; + context->fops_platform.fi[0].sig = NULL; - // context->fops_default[1].open is already NULL from zalloc + /* + * arrange a linear linked-list of fops starting from context->fops + * + * platform fops + * [ -> fops_zip (copied into context so .next settable) ] + * [ -> info->fops ] + */ - /* it can be overridden from context creation info */ + context->fops = &context->fops_platform; + prev = (struct lws_plat_file_ops *)context->fops; + +#if defined(LWS_WITH_ZIP_FOPS) + /* make a soft copy so we can set .next */ + context->fops_zip = fops_zip; + prev->next = &context->fops_zip; + prev = (struct lws_plat_file_ops *)prev->next; +#endif + + /* if user provided fops, tack them on the end of the list */ if (info->fops) - context->fops = info->fops; - else - context->fops = &context->fops_default[0]; + prev->next = info->fops; context->reject_service_keywords = info->reject_service_keywords; if (info->external_baggage_free_on_destroy) diff --git a/lib/fops-zip.c b/lib/fops-zip.c new file mode 100644 index 00000000..02f49996 --- /dev/null +++ b/lib/fops-zip.c @@ -0,0 +1,667 @@ +/* + * libwebsockets - small server side websockets and web server implementation + * + * Original code used in this source file: + * + * https://github.com/PerBothner/DomTerm.git @912add15f3d0aec + * + * ./lws-term/io.c + * ./lws-term/junzip.c + * + * Copyright (C) 2017 Per Bothner + * + * MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * ( copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * + * lws rewrite: + * + * Copyright (C) 2017 Andy Green + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation: + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#include "private-libwebsockets.h" + +#include + +/* + * This code works with zip format containers which may have files compressed + * with gzip deflate (type 8) or store uncompressed (type 0). + * + * Linux zip produces such zipfiles by default, eg + * + * $ zip ../myzip.zip file1 file2 file3 + */ + +#define ZIP_COMPRESSION_METHOD_STORE 0 +#define ZIP_COMPRESSION_METHOD_DEFLATE 8 + +typedef struct { + lws_filepos_t filename_start; + uint32_t crc32; + uint32_t comp_size; + uint32_t uncomp_size; + uint32_t offset; + uint32_t mod_time; + uint16_t filename_len; + uint16_t extra; + uint16_t method; + uint16_t file_com_len; +} lws_fops_zip_hdr_t; + +typedef struct { + struct lws_fop_fd fop_fd; /* MUST BE FIRST logical fop_fd into + * file inside zip: fops_zip fops */ + lws_fop_fd_t zip_fop_fd; /* logical fop fd on to zip file + * itself: using platform fops */ + lws_fops_zip_hdr_t hdr; + z_stream inflate; + lws_filepos_t content_start; + lws_filepos_t exp_uncomp_pos; + union { + uint8_t trailer8[8]; + uint32_t trailer32[2]; + } u; + uint8_t rbuf[128]; /* decompression chunk size */ + int entry_count; + + unsigned int decompress:1; /* 0 = direct from file */ + unsigned int add_gzip_container:1; +} *lws_fops_zip_t; + +struct lws_plat_file_ops fops_zip; +#define fop_fd_to_priv(FD) ((lws_fops_zip_t)(FD)) + +static const uint8_t hd[] = { 31, 139, 8, 0, 0, 0, 0, 0, 0, 3 }; + +enum { + ZC_SIGNATURE = 0, + ZC_VERSION_MADE_BY = 4, + ZC_VERSION_NEEDED_TO_EXTRACT = 6, + ZC_GENERAL_PURPOSE_BIT_FLAG = 8, + ZC_COMPRESSION_METHOD = 10, + ZC_LAST_MOD_FILE_TIME = 12, + ZC_LAST_MOD_FILE_DATE = 14, + ZC_CRC32 = 16, + ZC_COMPRESSED_SIZE = 20, + ZC_UNCOMPRESSED_SIZE = 24, + ZC_FILE_NAME_LENGTH = 28, + ZC_EXTRA_FIELD_LENGTH = 30, + + ZC_FILE_COMMENT_LENGTH = 32, + ZC_DISK_NUMBER_START = 34, + ZC_INTERNAL_FILE_ATTRIBUTES = 36, + ZC_EXTERNAL_FILE_ATTRIBUTES = 38, + ZC_REL_OFFSET_LOCAL_HEADER = 42, + ZC_DIRECTORY_LENGTH = 46, + + ZE_SIGNATURE_OFFSET = 0, + ZE_DESK_NUMBER = 4, + ZE_CENTRAL_DIRECTORY_DISK_NUMBER = 6, + ZE_NUM_ENTRIES_THIS_DISK = 8, + ZE_NUM_ENTRIES = 10, + ZE_CENTRAL_DIRECTORY_SIZE = 12, + ZE_CENTRAL_DIR_OFFSET = 16, + ZE_ZIP_COMMENT_LENGTH = 20, + ZE_DIRECTORY_LENGTH = 22, + + ZL_REL_OFFSET_CONTENT = 28, + ZL_HEADER_LENGTH = 30, + + LWS_FZ_ERR_SEEK_END_RECORD = 1, + LWS_FZ_ERR_READ_END_RECORD, + LWS_FZ_ERR_END_RECORD_MAGIC, + LWS_FZ_ERR_END_RECORD_SANITY, + LWS_FZ_ERR_CENTRAL_SEEK, + LWS_FZ_ERR_CENTRAL_READ, + LWS_FZ_ERR_CENTRAL_SANITY, + LWS_FZ_ERR_NAME_TOO_LONG, + LWS_FZ_ERR_NAME_READ, + LWS_FZ_ERR_CONTENT_SANITY, + LWS_FZ_ERR_CONTENT_SEEK, + LWS_FZ_ERR_SCAN_SEEK, + LWS_FZ_ERR_NOT_FOUND, + LWS_FZ_ERR_ZLIB_INIT, + LWS_FZ_ERR_READ_CONTENT, + LWS_FZ_ERR_SEEK_COMPRESSED, +}; + +static uint16_t +get_u16(void *p) +{ + const uint8_t *c = (const uint8_t *)p; + + return (uint16_t)((c[0] | (c[1] << 8))); +} + +static uint32_t +get_u32(void *p) +{ + const uint8_t *c = (const uint8_t *)p; + + return (uint32_t)((c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24))); +} + +int +lws_fops_zip_scan(lws_fops_zip_t priv, const char *name, int len) +{ + lws_filepos_t amount; + uint8_t buf[64]; + int i; + + if (lws_vfs_file_seek_end(priv->zip_fop_fd, -ZE_DIRECTORY_LENGTH) < 0) + return LWS_FZ_ERR_SEEK_END_RECORD; + + if (lws_vfs_file_read(priv->zip_fop_fd, &amount, buf, + ZE_DIRECTORY_LENGTH)) + return LWS_FZ_ERR_READ_END_RECORD; + + if (amount != ZE_DIRECTORY_LENGTH) + return LWS_FZ_ERR_READ_END_RECORD; + + /* + * We require the zip to have the last record right at the end + * Linux zip always does this if no zip comment. + */ + if (buf[0] != 'P' || buf[1] != 'K' || buf[2] != 5 || buf[3] != 6) + return LWS_FZ_ERR_END_RECORD_MAGIC; + + i = get_u16(buf + ZE_NUM_ENTRIES); + + if (get_u16(buf + ZE_DESK_NUMBER) || + get_u16(buf + ZE_CENTRAL_DIRECTORY_DISK_NUMBER) || + i != get_u16(buf + ZE_NUM_ENTRIES_THIS_DISK)) + return LWS_FZ_ERR_END_RECORD_SANITY; + + /* end record is OK... look for our file in the central dir */ + + if (lws_vfs_file_seek_set(priv->zip_fop_fd, + get_u32(buf + ZE_CENTRAL_DIR_OFFSET)) < 0) + return LWS_FZ_ERR_CENTRAL_SEEK; + + while (i--) { + priv->content_start = lws_vfs_tell(priv->zip_fop_fd); + + if (lws_vfs_file_read(priv->zip_fop_fd, &amount, buf, + ZC_DIRECTORY_LENGTH)) + return LWS_FZ_ERR_CENTRAL_READ; + + if (amount != ZC_DIRECTORY_LENGTH) + return LWS_FZ_ERR_CENTRAL_READ; + + if (get_u32(buf + ZC_SIGNATURE) != 0x02014B50) + return LWS_FZ_ERR_CENTRAL_SANITY; + + lwsl_debug("cstart 0x%lx\n", priv->content_start); + + priv->hdr.filename_len = get_u16(buf + ZC_FILE_NAME_LENGTH); + priv->hdr.extra = get_u16(buf + ZC_EXTRA_FIELD_LENGTH); + priv->hdr.filename_start = lws_vfs_tell(priv->zip_fop_fd); + + priv->hdr.method = get_u16(buf + ZC_COMPRESSION_METHOD); + priv->hdr.crc32 = get_u32(buf + ZC_CRC32); + priv->hdr.comp_size = get_u32(buf + ZC_COMPRESSED_SIZE); + priv->hdr.uncomp_size = get_u32(buf + ZC_UNCOMPRESSED_SIZE); + priv->hdr.offset = get_u32(buf + ZC_REL_OFFSET_LOCAL_HEADER); + priv->hdr.mod_time = get_u32(buf + ZC_LAST_MOD_FILE_TIME); + priv->hdr.file_com_len = get_u16(buf + ZC_FILE_COMMENT_LENGTH); + + if (priv->hdr.filename_len != len) + goto next; + + if (len >= sizeof(buf) - 1) + return LWS_FZ_ERR_NAME_TOO_LONG; + + if (priv->zip_fop_fd->fops->LWS_FOP_READ(priv->zip_fop_fd, + &amount, buf, len)) + return LWS_FZ_ERR_NAME_READ; + if (amount != len) + return LWS_FZ_ERR_NAME_READ; + + buf[len] = '\0'; + lwsl_debug("check %s vs %s\n", buf, name); + + if (strcmp((const char *)buf, name)) + goto next; + + /* we found a match */ + lws_vfs_file_seek_set(priv->zip_fop_fd, priv->hdr.offset); + if (priv->zip_fop_fd->fops->LWS_FOP_READ(priv->zip_fop_fd, + &amount, buf, + ZL_HEADER_LENGTH)) + return LWS_FZ_ERR_NAME_READ; + if (amount != ZL_HEADER_LENGTH) + return LWS_FZ_ERR_NAME_READ; + + priv->content_start = priv->hdr.offset + + ZL_HEADER_LENGTH + + priv->hdr.filename_len + + get_u16(buf + ZL_REL_OFFSET_CONTENT); + + lwsl_debug("content supposed to start at 0x%lx\n", + priv->content_start); + + if (priv->content_start > priv->zip_fop_fd->len) + return LWS_FZ_ERR_CONTENT_SANITY; + + if (lws_vfs_file_seek_set(priv->zip_fop_fd, + priv->content_start) < 0) + return LWS_FZ_ERR_CONTENT_SEEK; + + /* we are aligned at the start of the content */ + + priv->exp_uncomp_pos = 0; + + return 0; + +next: + if (i && lws_vfs_file_seek_set(priv->zip_fop_fd, + priv->content_start + + ZC_DIRECTORY_LENGTH + + priv->hdr.filename_len + + priv->hdr.extra + + priv->hdr.file_com_len) < 0) + return LWS_FZ_ERR_SCAN_SEEK; + } + + return LWS_FZ_ERR_NOT_FOUND; +} + +static int +lws_fops_zip_reset_inflate(lws_fops_zip_t priv) +{ + if (priv->decompress) + inflateEnd(&priv->inflate); + + priv->inflate.zalloc = Z_NULL; + priv->inflate.zfree = Z_NULL; + priv->inflate.opaque = Z_NULL; + priv->inflate.avail_in = 0; + priv->inflate.next_in = Z_NULL; + + if (inflateInit2(&priv->inflate, -MAX_WBITS) != Z_OK) { + lwsl_err("inflate init failed\n"); + return LWS_FZ_ERR_ZLIB_INIT; + } + + if (lws_vfs_file_seek_set(priv->zip_fop_fd, priv->content_start) < 0) + return LWS_FZ_ERR_CONTENT_SEEK; + + priv->exp_uncomp_pos = 0; + + return 0; +} + +static lws_fop_fd_t +lws_fops_zip_open(const struct lws_plat_file_ops *fops, const char *vfs_path, + const char *vpath, lws_fop_flags_t *flags) +{ + lws_fop_flags_t local_flags = 0; + lws_fops_zip_t priv; + char rp[192]; + int m; + + /* + * vpath points at the / after the fops signature in vfs_path, eg + * with a vfs_path "/var/www/docs/manual.zip/index.html", vpath + * will come pointing at "/index.html" + */ + + priv = lws_zalloc(sizeof(*priv)); + if (!priv) + return NULL; + + priv->fop_fd.fops = &fops_zip; + + m = sizeof(rp) - 1; + if ((vpath - vfs_path - 1) < m) + m = vpath - vfs_path - 1; + strncpy(rp, vfs_path, m); + rp[m] = '\0'; + + /* open the zip file itself using the incoming fops, not fops_zip */ + + priv->zip_fop_fd = fops->LWS_FOP_OPEN(fops, rp, NULL, &local_flags); + if (!priv->zip_fop_fd) { + lwsl_err("unable to open zip %s\n", rp); + goto bail1; + } + + if (*vpath == '/') + vpath++; + + m = lws_fops_zip_scan(priv, vpath, strlen(vpath)); + if (m) { + lwsl_err("unable to find record matching '%s' %d\n", vpath, m); + goto bail2; + } + + /* the directory metadata tells us modification time, so pass it on */ + priv->fop_fd.mod_time = priv->hdr.mod_time; + *flags |= LWS_FOP_FLAG_MOD_TIME_VALID | LWS_FOP_FLAG_VIRTUAL; + priv->fop_fd.flags = *flags; + + /* The zip fop_fd is left pointing at the start of the content. + * + * 1) Content could be uncompressed (STORE), and we can always serve + * that directly + * + * 2) Content could be compressed (GZIP), and the client can handle + * receiving GZIP... we can wrap it in a GZIP header and trailer + * and serve the content part directly. The flag indicating we + * are providing GZIP directly is set so lws will send the right + * headers. + * + * 3) Content could be compressed (GZIP) but the client can't handle + * receiving GZIP... we can decompress it and serve as it is + * inflated piecemeal. + * + * 4) Content may be compressed some unknown way... fail + * + */ + if (priv->hdr.method == ZIP_COMPRESSION_METHOD_STORE) { + /* + * it is stored uncompressed, leave it indicated as + * uncompressed, and just serve it from inside the + * zip with no gzip container; + */ + + lwsl_info("direct zip serving (stored)\n"); + + priv->fop_fd.len = priv->hdr.uncomp_size; + + return &priv->fop_fd; + } + + if ((*flags & LWS_FOP_FLAG_COMPR_ACCEPTABLE_GZIP) && + priv->hdr.method == ZIP_COMPRESSION_METHOD_DEFLATE) { + + /* + * We can serve the gzipped file contents directly as gzip + * from inside the zip container; client says it is OK. + * + * To convert to standalone gzip, we have to add a 10-byte + * constant header and a variable 8-byte trailer around the + * content. + * + * The 8-byte trailer is prepared now and held in the priv. + */ + + lwsl_info("direct zip serving (gzipped)\n"); + + priv->fop_fd.len = sizeof(hd) + priv->hdr.comp_size + + sizeof(priv->u); + + if (lws_is_be()) { + uint8_t *p = priv->u.trailer8; + + *p++ = (uint8_t)priv->hdr.crc32; + *p++ = (uint8_t)(priv->hdr.crc32 >> 8); + *p++ = (uint8_t)(priv->hdr.crc32 >> 16); + *p++ = (uint8_t)(priv->hdr.crc32 >> 24); + *p++ = (uint8_t)priv->hdr.uncomp_size; + *p++ = (uint8_t)(priv->hdr.uncomp_size >> 8); + *p++ = (uint8_t)(priv->hdr.uncomp_size >> 16); + *p = (uint8_t)(priv->hdr.uncomp_size >> 24); + } else { + priv->u.trailer32[0] = priv->hdr.crc32; + priv->u.trailer32[1] = priv->hdr.uncomp_size; + } + + *flags |= LWS_FOP_FLAG_COMPR_IS_GZIP; + priv->fop_fd.flags = *flags; + priv->add_gzip_container = 1; + + return &priv->fop_fd; + } + + if (priv->hdr.method == ZIP_COMPRESSION_METHOD_DEFLATE) { + + /* we must decompress it to serve it */ + + lwsl_info("decompressed zip serving\n"); + + priv->fop_fd.len = priv->hdr.uncomp_size; + + if (lws_fops_zip_reset_inflate(priv)) { + lwsl_err("inflate init failed\n"); + goto bail2; + } + + priv->decompress = 1; + + return &priv->fop_fd; + } + + /* we can't handle it ... */ + + lwsl_err("zipped file %s compressed in unknown way (%d)\n", vfs_path, + priv->hdr.method); + +bail2: + lws_vfs_file_close(&priv->zip_fop_fd); +bail1: + free(priv); + + return NULL; +} + +/* ie, we are closing the fop_fd for the file inside the gzip */ + +static int +lws_fops_zip_close(lws_fop_fd_t *fd) +{ + lws_fops_zip_t priv = fop_fd_to_priv(*fd); + + if (priv->decompress) + inflateEnd(&priv->inflate); + + lws_vfs_file_close(&priv->zip_fop_fd); /* close the gzip fop_fd */ + + free(priv); + *fd = NULL; + + return 0; +} + +static lws_fileofs_t +lws_fops_zip_seek_cur(lws_fop_fd_t fd, lws_fileofs_t offset_from_cur_pos) +{ + fd->pos += offset_from_cur_pos; + + return fd->pos; +} + +static int +lws_fops_zip_read(lws_fop_fd_t fd, lws_filepos_t *amount, uint8_t *buf, + lws_filepos_t len) +{ + lws_fops_zip_t priv = fop_fd_to_priv(fd); + lws_filepos_t ramount, rlen, cur = lws_vfs_tell(fd); + int ret; + + if (priv->decompress) { + + if (priv->exp_uncomp_pos != fd->pos) { + /* + * there has been a seek in the uncompressed fop_fd + * we have to restart the decompression and loop eating + * the decompressed data up to the seek point + */ + lwsl_info("seek in decompressed\n"); + + lws_fops_zip_reset_inflate(priv); + + while (priv->exp_uncomp_pos != fd->pos) { + rlen = len; + if (rlen > fd->pos - priv->exp_uncomp_pos) + rlen = fd->pos - priv->exp_uncomp_pos; + if (lws_fops_zip_read(fd, amount, buf, rlen)) + return LWS_FZ_ERR_SEEK_COMPRESSED; + } + *amount = 0; + } + + priv->inflate.avail_out = len; + priv->inflate.next_out = buf; + +spin: + if (!priv->inflate.avail_in) { + rlen = sizeof(priv->rbuf); + if (rlen > priv->hdr.comp_size - + (cur - priv->content_start)) + rlen = priv->hdr.comp_size - + (priv->hdr.comp_size - + priv->content_start); + + if (priv->zip_fop_fd->fops->LWS_FOP_READ( + priv->zip_fop_fd, &ramount, priv->rbuf, + rlen)) + return LWS_FZ_ERR_READ_CONTENT; + + cur += ramount; + + priv->inflate.avail_in = ramount; + priv->inflate.next_in = priv->rbuf; + } + + ret = inflate(&priv->inflate, Z_NO_FLUSH); + if (ret == Z_STREAM_ERROR) + return ret; + + switch (ret) { + case Z_NEED_DICT: + ret = Z_DATA_ERROR; + /* and fall through */ + case Z_DATA_ERROR: + case Z_MEM_ERROR: + + return ret; + } + + if (!priv->inflate.avail_in && priv->inflate.avail_out && + cur != priv->content_start + priv->hdr.comp_size) + goto spin; + + *amount = len - priv->inflate.avail_out; + + priv->exp_uncomp_pos += *amount; + fd->pos += *amount; + + return 0; + } + + if (priv->add_gzip_container) { + + lwsl_info("%s: gzip + container\n", __func__); + *amount = 0; + + /* place the canned header at the start */ + + if (len && fd->pos < sizeof(hd)) { + rlen = sizeof(hd) - fd->pos; + if (rlen > len) + rlen = len; + /* provide stuff from canned header */ + memcpy(buf, hd + fd->pos, rlen); + fd->pos += rlen; + buf += rlen; + len -= rlen; + *amount += rlen; + } + + /* serve gzipped data direct from zipfile */ + + if (len && fd->pos >= sizeof(hd) && + fd->pos < priv->hdr.comp_size + sizeof(hd)) { + + rlen = priv->hdr.comp_size - (priv->zip_fop_fd->pos - + priv->content_start); + if (rlen > len) + rlen = len; + + if (rlen && + priv->zip_fop_fd->pos < (priv->hdr.comp_size + + priv->content_start)) { + if (lws_vfs_file_read(priv->zip_fop_fd, + &ramount, buf, rlen)) + return LWS_FZ_ERR_READ_CONTENT; + *amount += ramount; + fd->pos += ramount; // virtual pos + buf += ramount; + len -= ramount; + } + } + + /* place the prepared trailer at the end */ + + if (len && fd->pos >= priv->hdr.comp_size + sizeof(hd) && + fd->pos < priv->hdr.comp_size + sizeof(hd) + + sizeof(priv->u)) { + cur = fd->pos - priv->hdr.comp_size - sizeof(hd); + rlen = sizeof(priv->u) - cur; + if (rlen > len) + rlen = len; + + memcpy(buf, priv->u.trailer8 + cur, rlen); + + *amount += rlen; + fd->pos += rlen; + } + + return 0; + } + + lwsl_info("%s: store\n", __func__); + + if (len > priv->hdr.uncomp_size - (cur - priv->content_start)) + len = priv->hdr.comp_size - (priv->hdr.comp_size - + priv->content_start); + + if (priv->zip_fop_fd->fops->LWS_FOP_READ(priv->zip_fop_fd, + amount, buf, len)) + return LWS_FZ_ERR_READ_CONTENT; + + return 0; +} + +struct lws_plat_file_ops fops_zip = { + lws_fops_zip_open, + lws_fops_zip_close, + lws_fops_zip_seek_cur, + lws_fops_zip_read, + NULL, + { { ".zip/", 5 }, { ".jar/", 5 }, { ".war/", 5 } }, + NULL, +}; diff --git a/lib/junzip.c b/lib/junzip.c deleted file mode 100644 index b20d534e..00000000 --- a/lib/junzip.c +++ /dev/null @@ -1,267 +0,0 @@ -// Unzip library by Per Bothner and Joonas Pihlajamaa. -// See junzip.h for license and details. - -#include -#include - -#include - -#include "private-libwebsockets.h" - -enum { - ZC_SIGNATURE = 0, - ZC_VERSION_MADE_BY = 4, - ZC_VERSION_NEEDED_TO_EXTRACT = 6, - ZC_GENERAL_PURPOSE_BIT_FLAG = 8, - ZC_COMPRESSION_METHOD = 10, - ZC_LAST_MOD_FILE_TIME = 12, - ZC_LAST_MOD_FILE_DATE = 14, - ZC_CRC32 = 16, - ZC_COMPRESSED_SIZE = 20, - ZC_UNCOMPRESSED_SIZE = 24, - ZC_FILE_NAME_LENGTH = 28, - ZC_EXTRA_FIELD_LENGTH = 30, - ZC_FILE_COMMENT_LENGTH = 32, - ZC_DISK_NUMBER_START = 34, - ZC_INTERNAL_FILE_ATTRIBUTES = 36, - ZC_EXTERNAL_FILE_ATTRIBUTES = 38, - ZC_RELATIVE_OFFSET_OF_LOCAL_HEADER = 42, - ZC_DIRECTORY_LENGTH = 46, - - ZE_SIGNATURE_OFFSET = 0, - ZE_DESK_NUMBER = 4, - ZE_CENTRAL_DIRECTORY_DISK_NUMBER = 6, - ZE_NUM_ENTRIES_THIS_DISK = 8, - ZE_NUM_ENTRIES = 10, - ZE_CENTRAL_DIRECTORY_SIZE = 12, - ZE_CENTRAL_DIRECTORY_OFFSET = 16, - ZE_ZIP_COMMENT_LENGTH = 20, - ZE_DIRECTORY_LENGTH = 22, -}; - -static uint16_t -get_u16(void *p) -{ - const uint8_t *c = (const uint8_t *)p; - - return (uint16_t)((c[0] | (c[1] << 8))); -} - -static uint32_t -get_u32(void *p) -{ - const uint8_t *c = (const uint8_t *)p; - - return (uint32_t)((c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24))); -} - -static int -zf_seek_set(jzfile_t *zfile, size_t offset) -{ - int new_position = offset; - - if (new_position < 0 || new_position > zfile->length) - return -1; - zfile->position = new_position; - - return 0; -} - -static int -zf_seek_cur(jzfile_t *zfile, size_t offset) -{ - int new_position = zfile->position + offset; - - if (new_position < 0 || new_position > zfile->length) - return -1; - zfile->position = new_position; - - return 0; -} - -static int -zf_seek_end(jzfile_t *zfile, size_t offset) -{ - int new_position = zfile->length + offset; - - if (new_position < 0 || new_position > zfile->length) - return -1; - zfile->position = new_position; - - return 0; -} - -size_t -zf_read(jzfile_t *zfile, void *buf, size_t size) -{ - size_t avail = zfile->length - zfile->position; - - if (size > avail) - size = avail; - memcpy(buf, zfile->start + zfile->position, size); - zfile->position += size; - - return size; -} - -/* Read ZIP file end record. Will move within file. */ -int -jzReadEndRecord(jzfile_t *zip) -{ - unsigned char *ptr = zf_current(zip); - - if (zf_seek_end(zip, -ZE_DIRECTORY_LENGTH)) - return Z_ERRNO; - - while (ptr[0] != 0x50 || ptr[1] != 0x4B || ptr[2] != 5 || ptr[3] != 6) - if (ptr-- == zip->start) - return Z_ERRNO; - - zip->numEntries = get_u16(ptr + ZE_NUM_ENTRIES); - zip->centralDirectoryOffset= get_u32(ptr + ZE_CENTRAL_DIRECTORY_OFFSET); - - if (get_u16(ptr + ZE_DESK_NUMBER) || - get_u16(ptr + ZE_CENTRAL_DIRECTORY_DISK_NUMBER) || - zip->numEntries != get_u16(ptr + ZE_NUM_ENTRIES_THIS_DISK)) - return Z_ERRNO; - - return Z_OK; -} - -/* Read ZIP file global directory. Will move within file. */ -int -jzReadCentralDirectory(jzfile_t *zip, jzcb_t callback) -{ - jzfile_hdr_t h; - int i; - - if (zf_seek_set(zip, zip->centralDirectoryOffset)) - return Z_ERRNO; - - for (i = 0; i < zip->numEntries; i++) { - unsigned char *ptr = zf_current(zip); - - if (zf_available(zip) < ZC_DIRECTORY_LENGTH) - return Z_ERRNO; - - zf_seek_cur(zip, ZC_DIRECTORY_LENGTH); - if (get_u32(ptr + ZC_SIGNATURE) != 0x02014B50) - return Z_ERRNO; - - // Construct jzfile_hdr_t from global file h - h.compressionMethod = get_u16(ptr + ZC_COMPRESSION_METHOD); - h.crc32 = get_u32(ptr + ZC_CRC32); - h.compressedSize = get_u32(ptr + ZC_COMPRESSED_SIZE); - h.uncompressedSize = get_u32(ptr + ZC_UNCOMPRESSED_SIZE); - h.fileNameLength = get_u16(ptr + ZC_FILE_NAME_LENGTH); - h.extraFieldLength = get_u16(ptr + ZC_EXTRA_FIELD_LENGTH); - h.offset = get_u32(ptr + ZC_RELATIVE_OFFSET_OF_LOCAL_HEADER); - - h.fileNameStart = zf_tell(zip); - if (zf_seek_cur(zip, h.fileNameLength + h.extraFieldLength + - get_u16(ptr + ZC_FILE_COMMENT_LENGTH))) - return Z_ERRNO; - - if (!callback(zip, i, &h)) - break; // end if callback returns zero - } - - return Z_OK; -} - -int jzSeekData(jzfile_t *zip, jzfile_hdr_t *entry) -{ - size_t offset = entry->offset; - - offset += ZIP_LOCAL_FILE_HEADER_LENGTH; - offset += entry->fileNameLength + entry->extraFieldLength; - - if (offset < 0 || offset > zip->length) - return Z_STREAM_END; - - zip->position = offset; - - return Z_OK; -} - -/* Read data from file stream, described by h, to preallocated buffer */ -int -jzReadData(jzfile_t *zip, jzfile_hdr_t *h, void *buffer) -{ - unsigned char *bytes = (unsigned char *)buffer; - long compressedLeft, uncompressedLeft; - z_stream strm; - int ret; - - switch (h->compressionMethod) { - case 0: /* Store - just read it */ - if (zf_read(zip, buffer, h->uncompressedSize) < - h->uncompressedSize) - return Z_ERRNO; - break; - case 8: /* Deflate - using zlib */ - strm.zalloc = Z_NULL; - strm.zfree = Z_NULL; - strm.opaque = Z_NULL; - - strm.avail_in = 0; - strm.next_in = Z_NULL; - - /* - * Use inflateInit2 with negative window bits to - * indicate raw data - */ - if ((ret = inflateInit2(&strm, -MAX_WBITS)) != Z_OK) - return ret; /* Zlib errors are negative */ - - /* Inflate compressed data */ - for (compressedLeft = h->compressedSize, - uncompressedLeft = h->uncompressedSize; - compressedLeft && uncompressedLeft && ret != Z_STREAM_END; - compressedLeft -= strm.avail_in) { - /* Read next chunk */ - unsigned char *ptr = zf_current(zip); - - strm.avail_in = compressedLeft; - zf_seek_cur(zip, compressedLeft); - if (strm.avail_in == 0) { - inflateEnd(&strm); - - return Z_ERRNO; - } - - strm.next_in = ptr; - strm.avail_out = uncompressedLeft; - strm.next_out = bytes; - - compressedLeft -= strm.avail_in; - /* inflate will change avail_in */ - - ret = inflate(&strm, Z_NO_FLUSH); - - if (ret == Z_STREAM_ERROR) - return ret; - - switch (ret) { - case Z_NEED_DICT: - ret = Z_DATA_ERROR; - /* and fall through */ - case Z_DATA_ERROR: case Z_MEM_ERROR: - (void)inflateEnd(&strm); - - return ret; - } - - /* bytes uncompressed */ - bytes += uncompressedLeft - strm.avail_out; - uncompressedLeft = strm.avail_out; - } - - inflateEnd(&strm); - break; - default: - return Z_ERRNO; - } - - return Z_OK; -} diff --git a/lib/lejp-conf.c b/lib/lejp-conf.c index 6fc358fe..8fb05531 100644 --- a/lib/lejp-conf.c +++ b/lib/lejp-conf.c @@ -455,7 +455,8 @@ lejp_vhosts_cb(struct lejp_ctx *ctx, char reason) "cgi://", ">http://", ">https://", - "callback://" + "callback://", + "gzip://", }; if (!a->fresh_mount) diff --git a/lib/libev.c b/lib/libev.c index 3f882b20..71834a2d 100644 --- a/lib/libev.c +++ b/lib/libev.c @@ -170,7 +170,7 @@ lws_libev_accept(struct lws *new_wsi, lws_sock_file_fd_type desc) if (!LWS_LIBEV_ENABLED(context)) return; - if (wsi->mode == LWSCM_RAW_FILEDESC) + if (new_wsi->mode == LWSCM_RAW_FILEDESC) fd = desc.filefd; else fd = desc.sockfd; diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index 43da8fbe..3f9612b5 100755 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -220,9 +220,7 @@ lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason) wsi->protocol->callback(wsi, LWS_CALLBACK_RAW_CLOSE_FILE, wsi->user_space, NULL, 0); - lws_free_wsi(wsi); - - return; + goto async_close; } #ifdef LWS_WITH_CGI @@ -264,8 +262,7 @@ lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason) if (wsi->mode == LWSCM_HTTP_SERVING_ACCEPTED && wsi->u.http.fop_fd != NULL) { - lws_vfs_file_close(wsi->u.http.fop_fd); - wsi->u.http.fop_fd = NULL; + lws_vfs_file_close(&wsi->u.http.fop_fd); wsi->vhost->protocols->callback(wsi, LWS_CALLBACK_CLOSED_HTTP, wsi->user_space, NULL, 0); wsi->told_user_closed = 1; @@ -606,6 +603,7 @@ just_kill_connection: LWS_EXT_CB_DESTROY_ANY_WSI_CLOSING, NULL, 0) < 0) lwsl_warn("ext destroy wsi failed\n"); +async_close: wsi->socket_is_permanently_unusable = 1; #ifdef LWS_USE_LIBUV @@ -971,32 +969,105 @@ lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, int len) LWS_VISIBLE LWS_EXTERN void lws_set_fops(struct lws_context *context, struct lws_plat_file_ops *fops) { - memcpy(&context->fops_default, fops, sizeof *fops); + memcpy(&context->fops, fops, sizeof *fops); } -LWS_VISIBLE LWS_EXTERN const struct lws_plat_file_ops * -lws_select_fops_by_vfs_path(const struct lws_context *context, const char *vfs_path) +LWS_VISIBLE LWS_EXTERN lws_filepos_t +lws_vfs_tell(lws_fop_fd_t fop_fd) { - const struct lws_plat_file_ops *fops = context->fops; - int hit = -1, n = 0, matchlen = 0, len; + return fop_fd->pos; +} - while (fops->open) { - len = strlen(fops->path_prefix); +LWS_VISIBLE LWS_EXTERN lws_filepos_t +lws_vfs_get_length(lws_fop_fd_t fop_fd) +{ + return fop_fd->len; +} - if (!strncmp(vfs_path, fops->path_prefix, len)) - if (len > matchlen) { - hit = n; - matchlen = len; +LWS_VISIBLE LWS_EXTERN uint32_t +lws_vfs_get_mod_time(lws_fop_fd_t fop_fd) +{ + return fop_fd->mod_time; +} + +LWS_VISIBLE lws_fileofs_t +lws_vfs_file_seek_set(lws_fop_fd_t fop_fd, lws_fileofs_t offset) +{ + lws_fileofs_t ofs; + lwsl_debug("%s: seeking to %ld, len %ld\n", __func__, offset, fop_fd->len); + ofs = fop_fd->fops->LWS_FOP_SEEK_CUR(fop_fd, offset - fop_fd->pos); + lwsl_debug("%s: result %ld, fop_fd pos %ld\n", __func__, ofs, fop_fd->pos); + return ofs; +} + + +LWS_VISIBLE lws_fileofs_t +lws_vfs_file_seek_end(lws_fop_fd_t fop_fd, lws_fileofs_t offset) +{ + return fop_fd->fops->LWS_FOP_SEEK_CUR(fop_fd, fop_fd->len + fop_fd->pos + offset); +} + + +const struct lws_plat_file_ops * +lws_vfs_select_fops(const struct lws_plat_file_ops *fops, const char *vfs_path, + const char **vpath) +{ + const struct lws_plat_file_ops *pf; + const char *p = vfs_path; + int n; + + *vpath = NULL; + + /* no non-platform fops, just use that */ + + if (!fops->next) + return fops; + + /* + * scan the vfs path looking for indications we are to be + * handled by a specific fops + */ + + while (*p) { + if (*p != '/') { + p++; + continue; + } + /* the first one is always platform fops, so skip */ + pf = fops->next; + while (pf) { + n = 0; + while (n < ARRAY_SIZE(pf->fi) && pf->fi[n].sig) { + if (p >= vfs_path + pf->fi[n].len) + if (!strncmp(p - (pf->fi[n].len - 1), + pf->fi[n].sig, + pf->fi[n].len - 1)) { + *vpath = p + 1; + return pf; + } + + n++; } - fops++; + pf = pf->next; + } + p++; } - if (hit < 0) - return context->fops_default; - - return &context->fops[hit]; + return fops; } +LWS_VISIBLE LWS_EXTERN lws_fop_fd_t LWS_WARN_UNUSED_RESULT +lws_vfs_file_open(const struct lws_plat_file_ops *fops, const char *vfs_path, + lws_fop_flags_t *flags) +{ + const char *vpath; + const struct lws_plat_file_ops *selected = lws_vfs_select_fops( + fops, vfs_path, &vpath); + + return selected->LWS_FOP_OPEN(fops, vfs_path, vpath, flags); +} + + /** * lws_now_secs() - seconds since 1970-1-1 * @@ -1396,7 +1467,7 @@ lws_union_transition(struct lws *wsi, enum connection_mode mode) LWS_VISIBLE struct lws_plat_file_ops * lws_get_fops(struct lws_context *context) { - return &context->fops_default[0]; + return (struct lws_plat_file_ops *)context->fops; } LWS_VISIBLE LWS_EXTERN struct lws_context * diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h index bf7cc642..14682a9b 100644 --- a/lib/libwebsockets.h +++ b/lib/libwebsockets.h @@ -33,6 +33,12 @@ extern "C" { #include #endif +static inline int lws_is_be(void) { + const int probe = ~0xff; + + return *(const char *)&probe; +} + #if defined(LWS_WITH_ESP8266) struct sockaddr_in; #define LWS_POSIX 0 @@ -1816,9 +1822,7 @@ struct lws_context_creation_info { * by a sentinel with NULL .open. * * If NULL, lws provides just the platform file operations struct for - * backwards compatibility. If set to point to an array of fops - * structs, lws_select_fops_by_vfs_path() will select the best match - * comparing the left of vfs_path to each fops .path_prefix. + * backwards compatibility. */ /* Add new things just above here ---^ @@ -2559,6 +2563,7 @@ lws_get_mimetype(const char *file, const struct lws_http_mount *m); LWS_VISIBLE LWS_EXTERN int lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type, const char *other_headers, int other_headers_len); + LWS_VISIBLE LWS_EXTERN int lws_serve_http_file_fragment(struct lws *wsi); //@} @@ -4268,29 +4273,27 @@ lws_cgi_kill(struct lws *wsi); #if defined(LWS_WITH_ESP32) /* sdk preprocessor defs? compiler issue? gets confused with member names */ -#define LWS_FOP_OPEN _open -#define LWS_FOP_CLOSE _close -#define LWS_FOP_SEEK_CUR _seek_cur -#define LWS_FOP_READ _read -#define LWS_FOP_WRITE _write +#define LWS_FOP_OPEN _open +#define LWS_FOP_CLOSE _close +#define LWS_FOP_SEEK_CUR _seek_cur +#define LWS_FOP_READ _read +#define LWS_FOP_WRITE _write #else -#define LWS_FOP_OPEN open -#define LWS_FOP_CLOSE close -#define LWS_FOP_SEEK_CUR seek_cur -#define LWS_FOP_READ read -#define LWS_FOP_WRITE write +#define LWS_FOP_OPEN open +#define LWS_FOP_CLOSE close +#define LWS_FOP_SEEK_CUR seek_cur +#define LWS_FOP_READ read +#define LWS_FOP_WRITE write #endif #define LWS_FOP_FLAGS_MASK ((1 << 23) - 1) #define LWS_FOP_FLAG_COMPR_ACCEPTABLE_GZIP (1 << 24) #define LWS_FOP_FLAG_COMPR_IS_GZIP (1 << 25) +#define LWS_FOP_FLAG_MOD_TIME_VALID (1 << 26) +#define LWS_FOP_FLAG_VIRTUAL (1 << 27) struct lws_plat_file_ops; -struct lws_fop_fd { - lws_filefd_type fd; - const struct lws_plat_file_ops *fops; - void *filesystem_priv; -}; + #if defined(WIN32) || defined(_WIN32) /* ... */ #if !defined(ssize_t) @@ -4313,26 +4316,49 @@ typedef unsigned char uint8_t; #endif #endif -typedef struct lws_fop_fd *lws_fop_fd_t; typedef size_t lws_filepos_t; typedef ssize_t lws_fileofs_t; typedef uint32_t lws_fop_flags_t; +struct lws_fop_fd { + lws_filefd_type fd; + /**< real file descriptor related to the file... */ + const struct lws_plat_file_ops *fops; + /**< fops that apply to this fop_fd */ + void *filesystem_priv; + /**< ignored by lws; owned by the fops handlers */ + lws_filepos_t pos; + /**< generic "position in file" */ + lws_filepos_t len; + /**< generic "length of file" */ + lws_fop_flags_t flags; + /**< copy of the returned flags */ + uint32_t mod_time; + /**< optional "modification time of file", only valid if .open() + * set the LWS_FOP_FLAG_MOD_TIME_VALID flag */ +}; +typedef struct lws_fop_fd *lws_fop_fd_t; + +struct lws_fops_index { + const char *sig; /* NULL or vfs signature, eg, ".zip/" */ + uint8_t len; /* length of above string */ +}; + struct lws_plat_file_ops { lws_fop_fd_t (*LWS_FOP_OPEN)(const struct lws_plat_file_ops *fops, - const char *filename, - lws_filepos_t *filelen, + const char *filename, const char *vpath, lws_fop_flags_t *flags); /**< Open file (always binary access if plat supports it) - * filelen is filled on exit to be the length of the file + * vpath may be NULL, or if the fops understands it, the point at which + * the filename's virtual part starts. * *flags & LWS_FOP_FLAGS_MASK should be set to O_RDONLY or O_RDWR. * If the file may be gzip-compressed, * LWS_FOP_FLAG_COMPR_ACCEPTABLE_GZIP is set. If it actually is * gzip-compressed, then the open handler should OR * LWS_FOP_FLAG_COMPR_IS_GZIP on to *flags before returning. */ - int (*LWS_FOP_CLOSE)(lws_fop_fd_t fop_fd); - /**< close file */ + int (*LWS_FOP_CLOSE)(lws_fop_fd_t *fop_fd); + /**< close file AND set the pointer to NULL */ lws_fileofs_t (*LWS_FOP_SEEK_CUR)(lws_fop_fd_t fop_fd, lws_fileofs_t offset_from_cur_pos); /**< seek from current position */ @@ -4342,8 +4368,12 @@ struct lws_plat_file_ops { int (*LWS_FOP_WRITE)(lws_fop_fd_t fop_fd, lws_filepos_t *amount, uint8_t *buf, lws_filepos_t len); /**< Write to file, on exit *amount is set to amount actually written */ - const char *path_prefix; - /**< Optional, NULL or filesystem namespace prefix matching this fops */ + + struct lws_fops_index fi[3]; + /**< vfs path signatures implying use of this fops */ + + const struct lws_plat_file_ops *next; + /**< NULL or next fops in list */ /* Add new things just above here ---^ * This is part of the ABI, don't needlessly break compatibility */ @@ -4358,24 +4388,63 @@ LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops * LWS_WARN_UNUSED_RESULT lws_get_fops(struct lws_context *context); LWS_VISIBLE LWS_EXTERN void lws_set_fops(struct lws_context *context, struct lws_plat_file_ops *fops); -LWS_VISIBLE LWS_EXTERN const struct lws_plat_file_ops * LWS_WARN_UNUSED_RESULT -lws_select_fops_by_vfs_path(const struct lws_context *context, const char *vfs_path); /** - * lws_plat_file_open() - file open operations + * lws_vfs_tell() - get current file position + * + * \param fop_fd: fop_fd we are asking about + */ +LWS_VISIBLE LWS_EXTERN lws_filepos_t LWS_WARN_UNUSED_RESULT +lws_vfs_tell(lws_fop_fd_t fop_fd); +/** + * lws_vfs_get_length() - get current file total length in bytes + * + * \param fop_fd: fop_fd we are asking about + */ +LWS_VISIBLE LWS_EXTERN lws_filepos_t LWS_WARN_UNUSED_RESULT +lws_vfs_get_length(lws_fop_fd_t fop_fd); +/** + * lws_vfs_get_mod_time() - get time file last modified + * + * \param fop_fd: fop_fd we are asking about + */ +LWS_VISIBLE LWS_EXTERN uint32_t LWS_WARN_UNUSED_RESULT +lws_vfs_get_mod_time(lws_fop_fd_t fop_fd); +/** + * lws_vfs_file_seek_set() - seek relative to start of file + * + * \param fop_fd: fop_fd we are seeking in + * \param offset: offset from start of file + */ +LWS_VISIBLE LWS_EXTERN lws_fileofs_t +lws_vfs_file_seek_set(lws_fop_fd_t fop_fd, lws_fileofs_t offset); +/** + * lws_vfs_file_seek_end() - seek relative to end of file + * + * \param fop_fd: fop_fd we are seeking in + * \param offset: offset from start of file + */ +LWS_VISIBLE LWS_EXTERN lws_fileofs_t +lws_vfs_file_seek_end(lws_fop_fd_t fop_fd, lws_fileofs_t offset); + +LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops fops_zip; + +/** + * lws_plat_file_open() - open vfs filepath * * \param fops: file ops struct that applies to this descriptor - * \param filename: filename to open - * \param filelen: length of file (filled in by call) + * \param vfs_path: filename to open * \param flags: pointer to open flags * + * The vfs_path is scanned for known fops signatures, and the open directed + * to any matching fops open. + * + * User code should use this api to perform vfs opens. + * * returns semi-opaque handle */ -static LWS_INLINE lws_fop_fd_t LWS_WARN_UNUSED_RESULT -lws_vfs_file_open(const struct lws_plat_file_ops *fops, const char *filename, - lws_filepos_t *filelen, lws_fop_flags_t *flags) -{ - return fops->LWS_FOP_OPEN(fops, filename, filelen, flags); -} +LWS_VISIBLE LWS_EXTERN lws_fop_fd_t LWS_WARN_UNUSED_RESULT +lws_vfs_file_open(const struct lws_plat_file_ops *fops, const char *vfs_path, + lws_fop_flags_t *flags); /** * lws_plat_file_close() - close file @@ -4383,9 +4452,9 @@ lws_vfs_file_open(const struct lws_plat_file_ops *fops, const char *filename, * \param fop_fd: file handle to close */ static LWS_INLINE int -lws_vfs_file_close(lws_fop_fd_t fop_fd) +lws_vfs_file_close(lws_fop_fd_t *fop_fd) { - return fop_fd->fops->LWS_FOP_CLOSE(fop_fd); + return (*fop_fd)->fops->LWS_FOP_CLOSE(fop_fd); } /** @@ -4429,15 +4498,15 @@ lws_vfs_file_write(lws_fop_fd_t fop_fd, lws_filepos_t *amount, return fop_fd->fops->LWS_FOP_WRITE(fop_fd, amount, buf, len); } -/* these are the flatform file operations implmenetations... they can +/* these are the platform file operations implementations... they can * be called directly and used in fops arrays */ LWS_VISIBLE LWS_EXTERN lws_fop_fd_t _lws_plat_file_open(const struct lws_plat_file_ops *fops, const char *filename, - lws_filepos_t *filelen, lws_fop_flags_t *flags); + const char *vpath, lws_fop_flags_t *flags); LWS_VISIBLE LWS_EXTERN int -_lws_plat_file_close(lws_fop_fd_t fop_fd); +_lws_plat_file_close(lws_fop_fd_t *fop_fd); LWS_VISIBLE LWS_EXTERN lws_fileofs_t _lws_plat_file_seek_cur(lws_fop_fd_t fop_fd, lws_fileofs_t offset); LWS_VISIBLE LWS_EXTERN int diff --git a/lib/lws-plat-esp32.c b/lib/lws-plat-esp32.c index 680dc560..e858b5a6 100644 --- a/lib/lws-plat-esp32.c +++ b/lib/lws-plat-esp32.c @@ -397,7 +397,7 @@ lws_plat_inet_ntop(int af, const void *src, char *dst, int cnt) LWS_VISIBLE lws_fop_fd_t _lws_plat_file_open(struct lws_plat_file_ops *fops, const char *filename, - lws_filepos_t *filelen, lws_fop_flags_t *flags) + const char *vpath, lws_fop_flags_t *flags) { struct stat stat_buf; lws_fop_fd_t fop_fd; @@ -414,9 +414,10 @@ _lws_plat_file_open(struct lws_plat_file_ops *fops, const char *filename, fop_fd->fops = fops; fop_fd->fd = ret; + fop_fd->flags = *flags; fop_fd->filesystem_priv = NULL; /* we don't use it */ - - *filelen = stat_buf.st_size; + fop_fd->pos = 0; + fop_fd->len = stat_buf.st_size; return fop_fd; @@ -427,11 +428,12 @@ bail: } LWS_VISIBLE int -_lws_plat_file_close(lws_fop_fd_t fops_fd) +_lws_plat_file_close(lws_fop_fd_t *fops_fd) { - int fd = fops_fd->fd; + int fd = (*fops_fd)->fd; - free(fd); + free(*fops_fd); + *fops_fd = NULL; return close(fd); } @@ -453,7 +455,7 @@ _lws_plat_file_read(lws_fop_fd_t fops_fd, lws_filepos_t *amount, *amount = 0; return -1; } - + fop_fd->pos += n; *amount = n; return 0; @@ -470,7 +472,7 @@ _lws_plat_file_write(lws_fop_fd_t fops_fd, lws_filepos_t *amount, *amount = 0; return -1; } - + fop_fd->pos += n; *amount = n; return 0; diff --git a/lib/lws-plat-optee.c b/lib/lws-plat-optee.c index f6051d09..20379bcd 100644 --- a/lib/lws-plat-optee.c +++ b/lib/lws-plat-optee.c @@ -263,14 +263,13 @@ lws_plat_inet_ntop(int af, const void *src, char *dst, int cnt) LWS_VISIBLE lws_fop_fd_t _lws_plat_file_open(lws_plat_file_open(struct lws_plat_file_ops *fops, - const char *filename, lws_filepos_t *filelen, - lws_fop_flags_t *flags) + const char *filename, lws_fop_flags_t *flags) { return NULL; } LWS_VISIBLE int -_lws_plat_file_close(lws_fop_fd_t fop_fd) +_lws_plat_file_close(lws_fop_fd_t *fop_fd) { return 0; } diff --git a/lib/lws-plat-unix.c b/lib/lws-plat-unix.c index 4ab2eea4..49c3d21e 100644 --- a/lib/lws-plat-unix.c +++ b/lib/lws-plat-unix.c @@ -611,7 +611,7 @@ lws_plat_inet_ntop(int af, const void *src, char *dst, int cnt) LWS_VISIBLE lws_fop_fd_t _lws_plat_file_open(const struct lws_plat_file_ops *fops, const char *filename, - lws_filepos_t *filelen, lws_fop_flags_t *flags) + const char *vpath, lws_fop_flags_t *flags) { struct stat stat_buf; int ret = open(filename, (*flags) & LWS_FOP_FLAGS_MASK, 0664); @@ -628,9 +628,11 @@ _lws_plat_file_open(const struct lws_plat_file_ops *fops, const char *filename, goto bail; fop_fd->fops = fops; + fop_fd->flags = *flags; fop_fd->fd = ret; fop_fd->filesystem_priv = NULL; /* we don't use it */ - *filelen = stat_buf.st_size; + fop_fd->len = stat_buf.st_size; + fop_fd->pos = 0; return fop_fd; @@ -640,18 +642,36 @@ bail: } LWS_VISIBLE int -_lws_plat_file_close(lws_fop_fd_t fop_fd) +_lws_plat_file_close(lws_fop_fd_t *fop_fd) { - int fd = fop_fd->fd; + int fd = (*fop_fd)->fd; + + free(*fop_fd); + *fop_fd = NULL; - free(fop_fd); return close(fd); } LWS_VISIBLE lws_fileofs_t _lws_plat_file_seek_cur(lws_fop_fd_t fop_fd, lws_fileofs_t offset) { - return lseek(fop_fd->fd, offset, SEEK_CUR); + lws_fileofs_t r; + + if (offset > 0 && offset > fop_fd->len - fop_fd->pos) + offset = fop_fd->len - fop_fd->pos; + + if ((lws_fileofs_t)fop_fd->pos + offset < 0) + offset = -fop_fd->pos; + + r = lseek(fop_fd->fd, offset, SEEK_CUR); + + if (r >= 0) + fop_fd->pos = r; + else + lwsl_err("error seeking from cur %ld, offset %ld\n", + fop_fd->pos, offset); + + return r; } LWS_VISIBLE int @@ -665,7 +685,9 @@ _lws_plat_file_read(lws_fop_fd_t fop_fd, lws_filepos_t *amount, *amount = 0; return -1; } - + fop_fd->pos += n; + lwsl_debug("%s: read %ld of req %ld, pos %ld, len %ld\n", __func__, n, + (long)len, fop_fd->pos, fop_fd->len); *amount = n; return 0; @@ -683,6 +705,7 @@ _lws_plat_file_write(lws_fop_fd_t fop_fd, lws_filepos_t *amount, return -1; } + fop_fd->pos += n; *amount = n; return 0; diff --git a/lib/lws-plat-win.c b/lib/lws-plat-win.c index 117b69f2..188f1a94 100644 --- a/lib/lws-plat-win.c +++ b/lib/lws-plat-win.c @@ -523,7 +523,7 @@ lws_plat_inet_ntop(int af, const void *src, char *dst, int cnt) LWS_VISIBLE lws_fop_fd_t _lws_plat_file_open(struct lws_plat_file_ops *fops, const char *filename, - lws_filepos_t *filelen, lws_fop_flags_t *flags) + const char *vpath, lws_fop_flags_t *flags) { HANDLE ret; WCHAR buf[MAX_PATH]; @@ -548,22 +548,23 @@ _lws_plat_file_open(struct lws_plat_file_ops *fops, const char *filename, fop_fd->fops = fops; fop_fd->fd = ret; fop_fd->filesystem_priv = NULL; /* we don't use it */ - - *filelen = GetFileSize(ret, NULL); + fop_fd->flags = *flags; + fop_fd->len = GetFileSize(ret, NULL); + fop_fd->pos = 0; return fop_fd; bail: - *filelen = 0; return NULL; } LWS_VISIBLE int -_lws_plat_file_close(lws_fop_fd_t fop_fd) +_lws_plat_file_close(lws_fop_fd_t *fop_fd) { - HANDLE fd = fop_fd->fd; + HANDLE fd = (*fop_fd)->fd; - free(fop_fd); + free(*fop_fd); + *fop_fd = NULL; CloseHandle((HANDLE)fd); @@ -588,6 +589,7 @@ _lws_plat_file_read(lws_fop_fd_t fop_fd, lws_filepos_t *amount, return 1; } + fop_fd->pos += _amount; *amount = (unsigned long)_amount; return 0; @@ -602,6 +604,8 @@ _lws_plat_file_write(lws_fop_fd_t fop_fd, lws_filepos_t *amount, (void)buf; (void)len; + fop_fd->pos += len; + lwsl_err("%s: not implemented yet on this platform\n", __func__); return -1; diff --git a/lib/output.c b/lib/output.c index 232246fb..efc9573e 100644 --- a/lib/output.c +++ b/lib/output.c @@ -574,7 +574,7 @@ LWS_VISIBLE int lws_serve_http_file_fragment(struct lws *wsi) wsi->trunc_offset, wsi->trunc_len) < 0) { lwsl_info("%s: closing\n", __func__); - return -1; + goto file_had_it; } continue; } @@ -594,7 +594,7 @@ LWS_VISIBLE int lws_serve_http_file_fragment(struct lws *wsi) if ((long)lws_vfs_file_seek_cur(wsi->u.http.fop_fd, wsi->u.http.range.start - wsi->u.http.filepos) < 0) - return -1; + goto file_had_it; wsi->u.http.filepos = wsi->u.http.range.start; @@ -634,7 +634,7 @@ LWS_VISIBLE int lws_serve_http_file_fragment(struct lws *wsi) } if (lws_vfs_file_read(wsi->u.http.fop_fd, &amount, p, poss) < 0) - return -1; /* caller will close */ + goto file_had_it; /* caller will close */ //lwsl_notice("amount %ld\n", amount); @@ -656,7 +656,7 @@ LWS_VISIBLE int lws_serve_http_file_fragment(struct lws *wsi) wsi->vhost->protocols[(int)wsi->protocol_interpret_idx].callback, wsi, LWS_CALLBACK_PROCESS_HTML, wsi->user_space, &args, 0) < 0) - return -1; + goto file_had_it; n = args.len; p = (unsigned char *)args.p; } else @@ -678,7 +678,7 @@ LWS_VISIBLE int lws_serve_http_file_fragment(struct lws *wsi) LWS_WRITE_HTTP ); if (m < 0) - return -1; + goto file_had_it; wsi->u.http.filepos += amount; @@ -703,7 +703,7 @@ LWS_VISIBLE int lws_serve_http_file_fragment(struct lws *wsi) if (lws_vfs_file_seek_cur(wsi->u.http.fop_fd, m - n) == (unsigned long)-1) - return -1; + goto file_had_it; } } all_sent: @@ -716,8 +716,7 @@ all_sent: { wsi->state = LWSS_HTTP; /* we might be in keepalive, so close it off here */ - lws_vfs_file_close(wsi->u.http.fop_fd); - wsi->u.http.fop_fd = NULL; + lws_vfs_file_close(&wsi->u.http.fop_fd); lwsl_debug("file completed\n"); @@ -736,6 +735,11 @@ all_sent: lws_callback_on_writable(wsi); return 0; /* indicates further processing must be done */ + +file_had_it: + lws_vfs_file_close(&wsi->u.http.fop_fd); + + return -1; } #if LWS_POSIX diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index 3431c971..80d06368 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -439,57 +439,6 @@ extern "C" { #define SYSTEM_RANDOM_FILEPATH "/dev/urandom" #endif -/** - * Unzip library by Per Bothner. - * Loosely based on Joonas Pihlajamaa's JUnzip. - * Released into public domain. https://github.com/jokkebk/JUnzip - * -------> - */ - -typedef struct jzfile { - unsigned char *start; - off_t length; - long position; - int numEntries; - uint32_t centralDirectoryOffset; -} jzfile_t; - -#define zf_tell(ZF) ((ZF)->position) -#define zf_available(ZF) ((ZF)->length - (ZF)->position) -#define zf_current(ZF) ((ZF)->start + (ZF)->position) - -#define ZIP_LOCAL_FILE_HEADER_LENGTH 30 - -typedef struct { - uint16_t compressionMethod; - uint32_t crc32; - uint32_t compressedSize; - uint32_t uncompressedSize; - long fileNameStart; - uint16_t fileNameLength; - uint16_t extraFieldLength; // unsupported - uint32_t offset; -} jzfile_hdr_t; - -// Callback prototype for central and local file record reading functions -typedef int (*jzcb_t)(jzfile_t *zip, int index, jzfile_hdr_t *header); - -// Read ZIP file end record. Will move within file. -int jzReadEndRecord(jzfile_t *zip); - -// Read ZIP file global directory. Will move within file. -// Callback is called for each record, until callback returns zero -int jzReadCentralDirectory(jzfile_t *zip, jzcb_t callback); - - // See to the start of the actual data of the given entry. -int jzSeekData(jzfile_t *zip, jzfile_hdr_t *header); - -// Read data from file stream, described by header, to preallocated buffer -// Return value is zlib coded, e.g. Z_OK, or error code -int jzReadData(jzfile_t *zip, jzfile_hdr_t *header, void *buffer); - -/* <------ */ - enum lws_websocket_opcodes_07 { LWSWSOPC_CONTINUATION = 0, LWSWSOPC_TEXT_FRAME = 1, @@ -860,7 +809,10 @@ struct lws_context { time_t last_ws_ping_pong_check_s; time_t time_up; const struct lws_plat_file_ops *fops; - struct lws_plat_file_ops fops_default[2]; + struct lws_plat_file_ops fops_platform; +#if defined(LWS_WITH_ZIP_FOPS) + struct lws_plat_file_ops fops_zip; +#endif struct lws_context_per_thread pt[LWS_MAX_SMP]; struct lws_conn_stats conn_stats; #ifdef _WIN32 @@ -947,6 +899,7 @@ struct lws_context { short server_string_len; unsigned short ws_ping_pong_interval; unsigned short deprecation_pending_listen_close_count; + uint8_t max_fi; }; #define lws_get_context_protocol(ctx, x) ctx->vhost_list->protocols[x] @@ -2005,6 +1958,10 @@ void lws_free(void *p); #define lws_free_set_NULL(P) do { lws_realloc(P, 0); (P) = NULL; } while(0) #endif +const struct lws_plat_file_ops * +lws_vfs_select_fops(const struct lws_plat_file_ops *fops, const char *vfs_path, + const char **vpath); + /* lws_plat_ */ LWS_EXTERN void lws_plat_delete_socket_from_fds(struct lws_context *context, diff --git a/lib/server.c b/lib/server.c index 73be40a2..32d972e4 100644 --- a/lib/server.c +++ b/lib/server.c @@ -312,6 +312,22 @@ lws_get_mimetype(const char *file, const struct lws_http_mount *m) return NULL; } +static lws_fop_flags_t +lws_vfs_prepare_flags(struct lws *wsi) +{ + lws_fop_flags_t f = 0; + + if (!lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_ACCEPT_ENCODING)) + return f; + + if (strstr(lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_ACCEPT_ENCODING), + "gzip")) { + lwsl_info("client indicates GZIP is acceptable\n"); + f |= LWS_FOP_FLAG_COMPR_ACCEPTABLE_GZIP; + } + + return f; +} static int lws_http_serve(struct lws *wsi, char *uri, const char *origin, @@ -319,8 +335,11 @@ lws_http_serve(struct lws *wsi, char *uri, const char *origin, { const struct lws_protocol_vhost_options *pvo = m->interpret; struct lws_process_html_args args; - const char *mimetype; -#if !defined(_WIN32_WCE) && !defined(LWS_WITH_ESP8266) && !defined(LWS_WITH_ESP32) + const char *mimetype, *vpath; +#if !defined(_WIN32_WCE) && !defined(LWS_WITH_ESP8266) && \ + !defined(LWS_WITH_ESP32) + const struct lws_plat_file_ops *fops; + lws_fop_flags_t fflags = LWS_O_RDONLY; struct stat st; int spin = 0; #endif @@ -334,15 +353,37 @@ lws_http_serve(struct lws *wsi, char *uri, const char *origin, lws_snprintf(path, sizeof(path) - 1, "%s/%s", origin, uri); -#if !defined(_WIN32_WCE) && !defined(LWS_WITH_ESP8266) && !defined(LWS_WITH_ESP32) + fflags |= lws_vfs_prepare_flags(wsi); + +#if !defined(_WIN32_WCE) && !defined(LWS_WITH_ESP8266) && \ + !defined(LWS_WITH_ESP32) do { spin++; + fops = lws_vfs_select_fops(wsi->context->fops, path, &vpath); - if (stat(path, &st)) { + if (wsi->u.http.fop_fd) + lws_vfs_file_close(&wsi->u.http.fop_fd); + + wsi->u.http.fop_fd = fops->LWS_FOP_OPEN(wsi->context->fops, + path, vpath, &fflags); + if (!wsi->u.http.fop_fd) { + lwsl_err("Unable to open '%s'\n", path); + + return -1; + } + + /* if it can't be statted, don't try */ + if (fflags & LWS_FOP_FLAG_VIRTUAL) + break; + + if (fstat(wsi->u.http.fop_fd->fd, &st)) { lwsl_info("unable to stat %s\n", path); goto bail; } + wsi->u.http.fop_fd->mod_time = (uint32_t)st.st_mtime; + fflags |= LWS_FOP_FLAG_MOD_TIME_VALID; + lwsl_debug(" %s mode %d\n", path, S_IFMT & st.st_mode); #if !defined(WIN32) && LWS_POSIX if ((S_IFMT & st.st_mode) == S_IFLNK) { @@ -367,8 +408,9 @@ lws_http_serve(struct lws *wsi, char *uri, const char *origin, if (spin == 5) lwsl_err("symlink loop %s \n", path); - n = sprintf(sym, "%08lX%08lX", (unsigned long)st.st_size, - (unsigned long)st.st_mtime); + n = sprintf(sym, "%08lX%08lX", + (unsigned long)lws_vfs_get_length(wsi->u.http.fop_fd), + (unsigned long)lws_vfs_get_mod_time(wsi->u.http.fop_fd)); /* disable ranges if IF_RANGE token invalid */ @@ -382,7 +424,8 @@ lws_http_serve(struct lws *wsi, char *uri, const char *origin, * he thinks he has some version of it already, * check if the tag matches */ - if (!strcmp(sym, lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_IF_NONE_MATCH))) { + if (!strcmp(sym, lws_hdr_simple_ptr(wsi, + WSI_TOKEN_HTTP_IF_NONE_MATCH))) { lwsl_debug("%s: ETAG match %s %s\n", __func__, uri, origin); @@ -407,6 +450,8 @@ lws_http_serve(struct lws *wsi, char *uri, const char *origin, return -1; } + lws_vfs_file_close(&wsi->u.http.fop_fd); + return lws_http_transaction_completed(wsi); } } @@ -2060,7 +2105,7 @@ lws_server_socket_service(struct lws_context *context, struct lws *wsi, len = lws_ssl_capable_read(wsi, pt->serv_buf, context->pt_serv_buf_size); - lwsl_notice("%s: wsi %p read %d\r\n", __func__, wsi, len); +// lwsl_notice("%s: wsi %p read %d\r\n", __func__, wsi, len); switch (len) { case 0: lwsl_info("%s: read 0 len\n", __func__); @@ -2228,39 +2273,33 @@ lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type, unsigned char *end = p + context->pt_serv_buf_size - LWS_PRE; unsigned long computed_total_content_length; int ret = 0, cclen = 8, n = HTTP_STATUS_OK; - lws_fop_flags_t fflags = O_RDONLY; + lws_fop_flags_t fflags = LWS_O_RDONLY; #if defined(LWS_WITH_RANGES) int ranges; #endif + const struct lws_plat_file_ops *fops; + const char *vpath; - if (lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_ACCEPT_ENCODING)) - if (strstr("gzip", lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_ACCEPT_ENCODING)) && - strstr("deflate", lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_ACCEPT_ENCODING))) { - lwsl_debug("client indicates GZIP is acceptable\n"); - fflags |= LWS_FOP_FLAG_COMPR_ACCEPTABLE_GZIP; - } - - - wsi->u.http.fop_fd = lws_vfs_file_open(lws_select_fops_by_vfs_path( - wsi->context, file), file, - &wsi->u.http.filelen, - &fflags); + /* + * We either call the platform fops .open with first arg platform fops, + * or we call fops_zip .open with first arg platform fops, and fops_zip + * open will decide whether to switch to fops_zip or stay with fops_def. + * + * If wsi->u.http.fop_fd is already set, the caller already opened it + */ if (!wsi->u.http.fop_fd) { - lwsl_err("Unable to open '%s'\n", file); + fops = lws_vfs_select_fops(wsi->context->fops, file, &vpath); + fflags |= lws_vfs_prepare_flags(wsi); + wsi->u.http.fop_fd = fops->LWS_FOP_OPEN(wsi->context->fops, + file, vpath, &fflags); + if (!wsi->u.http.fop_fd) { + lwsl_err("Unable to open '%s'\n", file); - return -1; - } - computed_total_content_length = wsi->u.http.filelen; - - if ((fflags & (LWS_FOP_FLAG_COMPR_ACCEPTABLE_GZIP | - LWS_FOP_FLAG_COMPR_IS_GZIP)) == - (LWS_FOP_FLAG_COMPR_ACCEPTABLE_GZIP | LWS_FOP_FLAG_COMPR_IS_GZIP)) { - if (lws_add_http_header_by_token(wsi, - WSI_TOKEN_HTTP_CONTENT_ENCODING, - (unsigned char *)"gzip, deflate", 13, &p, end)) return -1; - lwsl_debug("file is being provided in gzip\n"); + } } + wsi->u.http.filelen = lws_vfs_get_length(wsi->u.http.fop_fd); + computed_total_content_length = wsi->u.http.filelen; #if defined(LWS_WITH_RANGES) ranges = lws_ranges_init(wsi, rp, wsi->u.http.filelen); @@ -2279,6 +2318,8 @@ lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type, if (lws_http_transaction_completed(wsi)) return -1; /* <0 means just hang up */ + lws_vfs_file_close(&wsi->u.http.fop_fd); + return 0; /* == 0 means we dealt with the transaction complete */ } if (ranges) @@ -2288,6 +2329,16 @@ lws_serve_http_file(struct lws *wsi, const char *file, const char *content_type, if (lws_add_http_header_status(wsi, n, &p, end)) return -1; + if ((wsi->u.http.fop_fd->flags & (LWS_FOP_FLAG_COMPR_ACCEPTABLE_GZIP | + LWS_FOP_FLAG_COMPR_IS_GZIP)) == + (LWS_FOP_FLAG_COMPR_ACCEPTABLE_GZIP | LWS_FOP_FLAG_COMPR_IS_GZIP)) { + if (lws_add_http_header_by_token(wsi, + WSI_TOKEN_HTTP_CONTENT_ENCODING, + (unsigned char *)"gzip", 4, &p, end)) + return -1; + lwsl_info("file is being provided in gzip\n"); + } + #if defined(LWS_WITH_RANGES) if (ranges < 2 && content_type && content_type[0]) if (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_CONTENT_TYPE, diff --git a/test-server/candide.zip b/test-server/candide.zip new file mode 100644 index 0000000000000000000000000000000000000000..82a66199a701657e3b4819f36e9fe18f2379a886 GIT binary patch literal 211764 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≠n`uBSJk)KJe97l_njX)!w|P-xm#D)$QO8 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 k5La?jo0WXUyvcv$tw_a?Pq}`6(}- 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 J_TNPT_#Z=hx;Ov; literal 0 HcmV?d00001 diff --git a/test-server/test-server-http.c b/test-server/test-server-http.c index 154674b9..3b3029d8 100644 --- a/test-server/test-server-http.c +++ b/test-server/test-server-http.c @@ -292,13 +292,14 @@ int callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user, p = buffer + LWS_PRE; end = p + sizeof(buffer) - LWS_PRE; - pss->fop_fd = lws_vfs_file_open(lws_get_fops(lws_get_context(wsi)), - leaf_path, &file_len, &flags); - + pss->fop_fd = lws_vfs_file_open( + lws_get_fops(lws_get_context(wsi)), + leaf_path, &flags); if (!pss->fop_fd) { lwsl_err("failed to open file %s\n", leaf_path); return -1; } + file_len = lws_vfs_get_length(pss->fop_fd); /* * we will send a big jpeg file, but it could be @@ -346,7 +347,7 @@ int callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user, p - (buffer + LWS_PRE), LWS_WRITE_HTTP_HEADERS); if (n < 0) { - lws_vfs_file_close(pss->fop_fd); + lws_vfs_file_close(&pss->fop_fd); return -1; } /* @@ -588,12 +589,12 @@ later: lws_callback_on_writable(wsi); break; penultimate: - lws_vfs_file_close(pss->fop_fd); + lws_vfs_file_close(&pss->fop_fd); pss->fop_fd = NULL; goto try_to_reuse; bail: - lws_vfs_file_close(pss->fop_fd); + lws_vfs_file_close(&pss->fop_fd); return -1; diff --git a/test-server/test-server-libev.c b/test-server/test-server-libev.c index b27b2ed7..e1424ce2 100644 --- a/test-server/test-server-libev.c +++ b/test-server/test-server-libev.c @@ -150,16 +150,16 @@ static const struct lws_extension exts[] = { * compressed files without decompressing the whole archive) */ static lws_fop_fd_t -test_server_fops_open(struct lws_plat_file_ops *fops, const char *filename, - lws_filepos_t *filelen, lws_fop_flags_t *flags) +test_server_fops_open(const struct lws_plat_file_ops *fops, + const char *vfs_path, const char *vpath, + lws_fop_flags_t *flags) { lws_fop_fd_t n; /* call through to original platform implementation */ - n = fops_plat.open(fops, filename, filelen, flags); + n = fops_plat.open(fops, vfs_path, vpath, flags); - lwsl_notice("%s: opening %s, ret %p, len %lu\n", __func__, filename, - n, *filelen); + lwsl_notice("%s: opening %s, ret %p\n", __func__, vfs_path, n); return n; } diff --git a/test-server/test-server-v2.0.c b/test-server/test-server-v2.0.c index 7e5a559d..96e00a50 100644 --- a/test-server/test-server-v2.0.c +++ b/test-server/test-server-v2.0.c @@ -67,11 +67,33 @@ static const struct lws_extension exts[] = { }; /* - * mount a handler for a section of the URL space + * mount handlers for sections of the URL space */ +static const struct lws_http_mount mount_ziptest = { + NULL, /* linked-list pointer to next*/ + "/ziptest", /* mountpoint in URL namespace on this vhost */ + LOCAL_RESOURCE_PATH"/candide.zip", /* handler */ + NULL, /* default filename if none given */ + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 0, + 0, + LWSMPRO_FILE, /* origin points to a callback */ + 8, /* strlen("/ziptest"), ie length of the mountpoint */ + NULL, + + { NULL, NULL } // sentinel +}; + static const struct lws_http_mount mount_post = { - NULL, /* linked-list pointer to next*/ + (struct lws_http_mount *)&mount_ziptest, /* linked-list pointer to next*/ "/formtest", /* mountpoint in URL namespace on this vhost */ "protocol-post-demo", /* handler */ NULL, /* default filename if none given */ diff --git a/test-server/test-server.c b/test-server/test-server.c index 93fb116d..74c37da2 100644 --- a/test-server/test-server.c +++ b/test-server/test-server.c @@ -122,17 +122,20 @@ static struct lws_protocols protocols[] = { */ static lws_fop_fd_t test_server_fops_open(const struct lws_plat_file_ops *fops, - const char *filename, - lws_filepos_t *filelen, + const char *vfs_path, const char *vpath, lws_fop_flags_t *flags) { lws_fop_fd_t fop_fd; /* call through to original platform implementation */ - fop_fd = fops_plat.open(fops, filename, filelen, flags); + fop_fd = fops_plat.open(fops, vfs_path, vpath, flags); - lwsl_info("%s: opening %s, ret %p, len %lu\n", __func__, filename, - fop_fd, (long)*filelen); + if (fop_fd) + lwsl_info("%s: opening %s, ret %p, len %lu\n", __func__, + vfs_path, fop_fd, + (long)lws_vfs_get_length(fop_fd)); + else + lwsl_info("%s: open %s failed\n", __func__, vfs_path); return fop_fd; }