From kde-commits Sun Jul 30 20:07:11 2006 From: Allan Sandfeld Jensen Date: Sun, 30 Jul 2006 20:07:11 +0000 To: kde-commits Subject: branches/work/kio_virtualfile/kioslave/http Message-Id: <1154290031.721816.29032.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=115429004222509 SVN commit 567987 by carewolf: Beginning of random-access HTTP M +94 -6 http.cc M +3 -0 http.h M +1 -0 http.protocol --- branches/work/kio_virtualfile/kioslave/http/http.cc #567986:567987 @@ -61,6 +61,7 @@ #include #include +#include "kio/connection.h" #include "kio/ioslave_defaults.h" #include "kio/http_slave_defaults.h" @@ -1244,6 +1245,89 @@ httpError(); } +void HTTPProtocol::open( const KUrl& url, int access ) +{ + kDebug(7103) << "(" << m_pid << ") HTTPProtocol::open " << url.url() << endl; + + if ( !checkRequestURL( url ) ) + return; + + m_request.method = HTTP_HEAD; + m_request.path = url.path(); + m_request.query = url.query(); + + // ### use cache + m_request.bUseCache = false; + + m_request.passwd = url.pass(); + m_request.user = url.user(); + m_request.doProxy = m_bUseProxy; + + retrieveHeader( false ); + + KIO::filesize_t pos = 0; +// emit mimeType( m_strMimeType ); + emit totalSize( m_iSize ); + emit position( pos ); + emit opened(); + + // Command-loop: + int cmd = CMD_NONE; + while (true) { + kDebug( 7103 ) << "HTTP::open -- loop" << endl; + QByteArray args; + int stat = appconn->read(&cmd, args); + if ( stat == -1 ) + { // error + kDebug( 7103 ) << "HTTP::open -- connection error" << endl; + break; + } + QDataStream stream( args ); + switch( cmd ) { + case CMD_READ: { + kDebug( 7103 ) << "HTTP::open -- read" << endl; + int bytes; + stream >> bytes; + m_request.method = HTTP_GET; + m_request.offset = pos; + m_request.length = bytes; + retrieveContent( true ); + pos += bytes; + emit data( m_bufWebDavData ); + m_bufWebDavData.clear(); + continue; + } + case CMD_WRITE: { + kDebug( 7103 ) << "HTTP::open -- write" << endl; + continue; + } + case CMD_SEEK: { + kDebug( 7103 ) << "HTTP::open -- seek" << endl; + int offset; + stream >> offset; + pos = offset; + // if partial gets works at all seek is automatically succesfull + emit position( offset ); + continue; + } + case CMD_NONE: + kDebug( 7103 ) << "HTTP::open -- none " << endl; + continue; + case CMD_CLOSE: + kDebug( 7103 ) << "HTTP::open -- close " << endl; + break; + default: + kDebug( 7103 ) << "HTTP::open -- invalid command: " << cmd << endl; + break; + } + break; + } + + httpClose(false); // Always close connection. + finished(); +} + + void HTTPProtocol::copy( const KUrl& src, const KUrl& dest, int, bool overwrite ) { kDebug(7113) << "(" << m_pid << ") HTTPProtocol::copy " << src.prettyUrl() @@ -2330,10 +2414,13 @@ header += "\r\n"; } - if ( m_request.offset > 0 ) + if ( m_request.offset > 0 || m_request.length > 0) { - header += QString("Range: bytes=%1-\r\n").arg(KIO::number(m_request.offset)); - kDebug(7103) << "kio_http : Range = " << KIO::number(m_request.offset) << endl; + if (m_request.length == 0) + header += QString("Range: bytes=%1-\r\n").arg(KIO::number(m_request.offset)); + else + header += QString("Range: bytes=%1-%2\r\n").arg(KIO::number(m_request.offset)).arg(KIO::number(m_request.offset+m_request.length-1)); + kDebug(7103) << "Range = " << KIO::number(m_request.offset) << ":" << KIO::number(m_request.length) << endl; } if ( m_request.cache == CC_Reload ) @@ -2619,7 +2706,7 @@ setMetaData("expire-date", tmp); tmp.setNum(m_request.creationDate); setMetaData("cache-creation-date", tmp); - mimeType(m_strMimeType); +// mimeType(m_strMimeType); forwardHttpResponseHeader(); return true; } @@ -2830,6 +2917,7 @@ else if (m_responseCode == 416) // Range not supported { m_request.offset = 0; + m_request.length = 0; httpCloseConnection(); return false; // Try again. } @@ -3703,8 +3791,8 @@ if (locationStr.isEmpty() && (!m_strMimeType.isEmpty() || m_request.method == HTTP_HEAD)) { - kDebug(7113) << "(" << m_pid << ") Emitting mimetype " << m_strMimeType << endl; - mimeType( m_strMimeType ); + kDebug(7103) << "(" << m_pid << ") Emitting mimetype " << m_strMimeType << endl; +// mimeType( m_strMimeType ); } forwardHttpResponseHeader(); --- branches/work/kio_virtualfile/kioslave/http/http.h #567986:567987 @@ -105,6 +105,7 @@ port = 0; method = KIO::HTTP_UNKNOWN; offset = 0; + length = 0; doProxy = false; allowCompressedPage = false; disablePassDlg = false; @@ -131,6 +132,7 @@ KIO::HTTP_METHOD method; KIO::CacheControl cache; KIO::filesize_t offset; + KIO::filesize_t length; bool doProxy; KUrl url; QString window; // Window Id this request is related to. @@ -192,6 +194,7 @@ virtual void get( const KUrl& url ); virtual void put( const KUrl& url, int _mode, bool overwrite, bool _resume ); + virtual void open( const KUrl& url, int access ); //----------------- Re-implemented methods for WebDAV ----------- virtual void listDir( const KUrl& url ); --- branches/work/kio_virtualfile/kioslave/http/http.protocol #567986:567987 @@ -4,6 +4,7 @@ input=none output=filesystem reading=true +opening=true defaultMimetype=application/octet-stream determineMimetypeFromExtension=false Icon=www