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; }
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; }
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); }
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; }
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; }
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 ); }