static int Lreader_extract(lua_State *L) { mz_zip_archive *za = luaL_checkudata(L, 1, LMZ_ZIP_READER); mz_uint flags = (mz_uint)luaL_optinteger(L, 3, 0); int type = lua_type(L, 2); luaL_Buffer b; mz_bool result = 0; luaL_buffinit(L, &b); if (type == LUA_TSTRING) result = mz_zip_reader_extract_file_to_callback(za, lua_tostring(L, 2), Lwriter, &b, flags); else if (type == LUA_TNUMBER) result = mz_zip_reader_extract_to_callback(za, (mz_uint)lua_tointeger(L, 2) - 1, Lwriter, &b, flags); luaL_pushresult(&b); return result ? 1 : 0; }
static int adapt_serve_zip_entry(struct mg_connection* connection, adapt_serving_context* context, const char* file_name) { int file_index = mz_zip_reader_locate_file(&context->zip, file_name, NULL, MZ_ZIP_FLAG_CASE_SENSITIVE); mz_zip_archive_file_stat file_info; if (mz_zip_reader_file_stat(&context->zip, file_index, &file_info)) { if (file_index >= 0) { // Possible filters struct adapt_sink_connection sink_connection; struct adapt_sink_safari_bug filter_safari_bug; struct adapt_sink_deobfuscate filter_deobfuscate; struct adapt_sink_inflator filter_inflator; struct adapt_sink_woff filter_woff; // Build filter chain. char* media_type = context->file_info ? context->file_info[file_index].media_type : NULL; struct adapt_sink* sink = &sink_connection.super; int known_length = 1; int flush = 0; sink_connection.super.write = adapt_sink_connection_write; sink_connection.connection = connection; if (media_type && strcmp(media_type, "application/xhtml+xml") == 0) { filter_safari_bug.super.write = adapt_sink_safari_bug_write; filter_safari_bug.state = 1; filter_safari_bug.next = sink; sink = &filter_safari_bug.super; } else if (media_type && adapt_convert_to_woff && (strcmp(media_type, "application/x-font-truetype") == 0 || strcmp(media_type, "application/x-font-opentype") == 0 || strcmp(media_type, "application/vnd.ms-opentype") == 0 || strcmp(media_type, "font/truetype") == 0 || strcmp(media_type, "font/opentype") == 0)) { filter_woff.buffer = NULL; filter_woff.buffer_size = 0; filter_woff.buffer_used = 0; filter_woff.super.write = adapt_sink_woff_write; filter_woff.next = sink; sink = &filter_woff.super; known_length = 0; flush = 1; } if (context->file_info && context->file_info[file_index].obfuscation) { if (file_info.m_method == 0) { /* Stored and obfuscated: obfuscation applied after deflate. */ filter_inflator.super.write = adapt_sink_inflator_write; tinfl_init(&filter_inflator.inflator); filter_inflator.inflated_file_offset = 0; filter_inflator.buffer_offset = 0; filter_inflator.next = sink; sink = &filter_inflator.super; known_length = 0; flush = 1; } filter_deobfuscate.super.write = adapt_sink_deobfuscate_write; filter_deobfuscate.obfuscation = context->file_info[file_index].obfuscation; filter_deobfuscate.next = sink; sink = &filter_deobfuscate.super; } mg_printf(connection, "HTTP/1.1 200 Success\r\n"); if (known_length) { mg_printf(connection, "Content-Length: %d\r\n", (int)file_info.m_uncomp_size); } if (media_type) { mg_printf(connection, "Content-Type: %s\r\n\r\n", media_type); } else { mg_printf(connection, "\r\n"); } mz_zip_reader_extract_to_callback(&context->zip, file_index, adapt_sink_write, sink, MZ_ZIP_FLAG_CASE_SENSITIVE); if (flush) { sink->write(sink, (size_t)file_info.m_uncomp_size, NULL, 0); } return 1; } mg_printf(connection, "HTTP/1.1 404 Not found\r\n" "Content-Length: 0\r\n" "\r\n"); return 1; } return 0; }