Example #1
0
int BufferedOS::writevEx(IOVec &vec, int avoidCache)
{
    assert(m_pOS != NULL);
    int ret;
    if (!m_buf.empty())
    {
        int oldLen = vec.len();
        m_buf.iovInsert(vec);
        //TEST: DEBUG Code
        //ret = 0;
        ret = m_pOS->writev(vec.get(), vec.len());
        vec.pop_front(vec.len() - oldLen);
        if (ret > 0)
        {
            int pop = ret;
            if (pop > m_buf.size())
                pop = m_buf.size();
            m_buf.pop_front(pop);
            ret -= pop;
        }
    }
    else
        //TEST: DEBUG Code
        //ret = 0;
        ret = m_pOS->writev(vec.get(), vec.len());
    if (ret >= avoidCache)
        ret = m_buf.cache(vec.get(), vec.len(), ret);
    //LS_DBG_H( "bufferedOS::writev() return %d, %d bytes in cache\n", ret, m_buf.size());
    return ret;
}
Example #2
0
int BufferedOS::writevEx( IOVec &vec, int avoidCache )
{
    assert( m_pOS != NULL );
    int ret;
    if ( !m_buf.empty() )
    {
        int oldLen = vec.len();
        m_buf.iov_insert( vec );
        //FIXME: DEBUG Code
        //ret = 0;
        ret = m_pOS->writev( vec );
        vec.pop_front( vec.len() - oldLen );
        if ( ret > 0 )
        {
            int pop = ret;
            if ( pop > m_buf.size() )
                pop = m_buf.size();
            m_buf.pop_front( pop );
            ret -= pop;
        }
    }
    else
        //FIXME: DEBUG Code
        //ret = 0;
        ret = m_pOS->writev( vec );
    if ( ret >= avoidCache )
    {
        ret = m_buf.cache( vec.get(), vec.len(), ret );
    }
    //if ( D_ENABLED( DL_MORE ) )
    //    LOG_D(( "bufferedOS::writev() return %d, %d bytes in cache\n", ret, m_buf.size() ));
    return ret;
}
Example #3
0
int BufferedOS::cacheWritev(IOVec &vector, int total)
{
    if (m_buf.size() + total < 40960)
    {
        m_buf.cache(vector.get(), vector.len(), 0);
        return total;
    }
    else
        return writevEx(vector, 0);
}
Example #4
0
int BufferedOS::flush()
{
    assert(m_pOS != NULL);
    int ret = 0;
    if (!m_buf.empty())
    {
        IOVec iov;
        m_buf.getIOvec(iov);
        ret = m_pOS->writev(iov.get(), iov.len());
        if (ret >= 0)
        {
            if (m_buf.size() <= ret)
                m_buf.clear();
            else
                m_buf.pop_front(ret);
//          LS_DBG_H( "bufferedOS::flush() writen %d, %d bytes in cache\n",
//                      ret, m_buf.size());
            ret = m_buf.size();
        }
    }
    return ret;
}
Example #5
0
int CacheOS::cacheWritev( IOVec &vec, int total, int * pRet)
{
    int ret = 0;
    int bufSize;
    int written = 0;
    int count = vec.len();
    const struct iovec * vector = vec.get();
    for( ; count > 0; --count, ++vector )
    {
        const char * pBuf =( const char *) vector->iov_base;
        bufSize = vector->iov_len;
        if (( pBuf != NULL )&&( bufSize > 0 ))
            written = cacheWrite( pBuf, bufSize, pRet );
        if ( written > 0 )
            ret += written;
        if ( ret < 0 )
            break;
        if ( written < bufSize )
            break;
    }
    return ret;
    
}
Example #6
0
void testWithHeader()
{
    const char * header[] =
    {
        "HTTP/1.1 200 OK\r\n",
        "Content-Type: text/html\r\n",
        "Transfer-Encoding: chunked\r\n",
        "\r\n"
    };
    TestOS1           testOS;
    TestOS            test2;
    ChunkOutputStream chunkOS;
    IOVec iov;
    int hs = 0;
    int ht;
    int ret;
    int size;
    unsigned int i;
    const char * pBody = "Hello World";
    for( i = 0 ; i < sizeof( header ) / sizeof( char *); ++i )
    {
        iov.append( header[i], strlen( header[i] ) );
        hs += strlen( header[i] );
    }
    ht = hs;
    chunkOS.setStream( &test2, &iov );
    chunkOS.open();
    ret = chunkOS.write( iov, ht, pBody, 11 );
    CHECK( ret == 11 );
    ret = chunkOS.close(iov, ht);
    CHECK( ret == 0 );
    size = test2.getBuf().size();
    CHECK( size == hs + chunkLen( 11 ) + 5 );
    CHECK( memcmp( test2.getBuf().c_str() + hs + chunkLen( 11 ) - 11 - 2,
                    pBody, 11 ) == 0 );
    
        
    hs = 0;
    for( i = 0 ; i < sizeof( header ) / sizeof( char *); ++i )
    {
        iov.append( header[i], strlen( header[i] ) );
        hs += strlen( header[i] );
    }
    ht = hs;
    char achBuf[MAX_CHUNK_SIZE * 2];
    memset( achBuf, 'c', MAX_CHUNK_SIZE );
    memset( (char *)achBuf + MAX_CHUNK_SIZE, 'd', MAX_CHUNK_SIZE );
    chunkOS.setStream( &testOS, &iov );
    chunkOS.open();
    while( ht > 0 )
    {
        ret = chunkOS.write( iov, ht, achBuf, MAX_CHUNK_SIZE );
        CHECK( ret == 0 );
    }
    CHECK( iov.len() == 0 );
    const char * pBuf = testOS.getBuf().c_str();
    for( i = 0 ; i < sizeof( header ) / sizeof( char *); ++i )
    {
        CHECK( strncmp( pBuf, header[i], strlen( header[i] )) == 0 );
        pBuf += strlen( header[i] );
    }
    
    while( ret == 0 )
    {
        ret = chunkOS.write( iov, ht, achBuf, MAX_CHUNK_SIZE );
    }
    CHECK( ret == MAX_CHUNK_SIZE );
    pBuf = testOS.getBuf().c_str();
    CHECK( memcmp( pBuf + hs +
            chunkLen( MAX_CHUNK_SIZE ) - MAX_CHUNK_SIZE - 2,
            achBuf, MAX_CHUNK_SIZE ) == 0 );
    ret = 0;
    while( ret == 0 )
    {
        ret = chunkOS.write( iov, ht, (char *)achBuf + MAX_CHUNK_SIZE, MAX_CHUNK_SIZE );
    }
    CHECK( ret == MAX_CHUNK_SIZE );
    pBuf = testOS.getBuf().c_str() + hs +
        chunkLen( MAX_CHUNK_SIZE ) * 2 - MAX_CHUNK_SIZE - 2;
    CHECK( memcmp( pBuf, 
        (char *)achBuf + MAX_CHUNK_SIZE, MAX_CHUNK_SIZE ) == 0 );
    ret = chunkOS.close(iov, ht);
    CHECK( ret == 1 );
    while( ret == 1 )
    {
        ret = chunkOS.flush();
    }
    CHECK( ret == 0 );
    size = testOS.getBuf().size();
    CHECK( size == hs + chunkLen( MAX_CHUNK_SIZE ) * 2 + 5 );
    CHECK( memcmp(
            testOS.getBuf().c_str() + hs + chunkLen( MAX_CHUNK_SIZE ) * 2,
            "0\r\n\r\n", 5 ) == 0 );
    
}