Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}