Skip to content

Decompress throw error when the size of origin data is less that 10 #968

Open
@zixincheng

Description

@zixincheng

I am working on some compress and decompress actions, I implement something like the following code to compress data into fixed chunk size 1024.

` std::unique_ptr< web::http::compression::compress_provider > compressor;
compressor = web::http::compression::builtin::make_compressor(
web::http::compression::builtin::algorithm::GZIP );

std::vector< uint8_t > cmp_buffer;
web::http::compression::operation_result r;
const size_t chunk_size = 1024;
size_t csize;
size_t i;

if ( data == nullptr || data_size == 0 )
{
    return cmp_buffer;
}

// compress in chunks
csize = 0;
cmp_buffer.resize( data_size );
for ( i = 0; i < data_size; i += chunk_size )
{
    r = compressor
            ->compress( data + i, std::min( chunk_size, data_size - i ),
                        cmp_buffer.data( ) + csize, std::min( chunk_size, data_size - csize ),
                        web::http::compression::operation_hint::has_more )
            .get( );
    csize += r.output_bytes_produced;
}
if ( i >= data_size )
{
    size_t cmpsize = data_size;
    do
    {
        if ( csize == cmpsize )
        {
            // extend the output buffer if there may be more compressed bytes to retrieve
            cmpsize += std::min( chunk_size, (size_t)200 );
            cmp_buffer.resize( cmpsize );
        }
        r = compressor
                ->compress( NULL, 0, cmp_buffer.data( ) + csize,
                            std::min( chunk_size, cmpsize - csize ),
                            web::http::compression::operation_hint::is_last )
                .get( );
        csize += r.output_bytes_produced;
    } while ( csize == cmpsize );
}

cmp_buffer.resize( csize );

return cmp_buffer;`

and following is the decompressed code:
`std::unique_ptr< web::http::compression::decompress_provider > decompressor
= web::http::compression::builtin::make_decompressor(
web::http::compression::builtin::algorithm::GZIP );

size_t buffer_size = data.size( ) * 3;
const size_t chunk_size = 1024;
std::vector< uint8_t > dcmp_buffer;
web::http::compression::operation_result r;
std::vector< size_t > chunk_sizes;
size_t dsize;
size_t nn;
nn = 0;
dsize = 0;
dcmp_buffer.resize( buffer_size );

do
{
    size_t n = std::min( chunk_size, data.size( ) - nn );
    do
    {
        if ( buffer_size <= dsize )
        {
            buffer_size += 1024;
            dcmp_buffer.resize( buffer_size );
        }
        r = decompressor
                ->decompress( data.data( ) + nn, n, dcmp_buffer.data( ) + dsize,
                              std::min( chunk_size, buffer_size - dsize ),
                              web::http::compression::operation_hint::has_more )
                .get( );
        dsize += r.output_bytes_produced;
        nn += r.input_bytes_processed;
        n -= r.input_bytes_processed;
    } while ( n );
} while ( nn < data.size( ) || !r.done );

dcmp_buffer.resize( dsize );

return dcmp_buffer;`

If the data_size is equal or larger than 10, say if I compress and decompress a string "1234567890", everything works fine.
If the data_size is less than 10, say "123", compress progress works fine but decompress will throw an error with code -3.
I wonder if i did something wrong or there is a bug in the compress function.

FYI, previous version works fine.

Thanks

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions