[haiku-commits] haiku: hrev46283 - src/kits/network/libnetapi headers/os/net

  • From: pulkomandy@xxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 24 Oct 2013 17:41:11 +0200 (CEST)

hrev46283 adds 2 changesets to branch 'master'
old head: 076952bc292644a6ed162cc49ddcd8cd3c47505b
new head: c52c444c2733032679528e83572e8f2f6d576a13
overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=c52c444+%5E076952b

----------------------------------------------------------------------------

f678220: Move UrlResult to HttpResult
  
   * Remove the fRawData field, as handling it is too complicated (it's
  not easy to have proper copy semantics on a BDataIO) and it's not used
  anyway, as the listener DataReceived call is enough to get the data and
  handle it.
   * All the remaining fields are HTTP-only, so rename the class to
  HttpResult and attach it to HttpRequest instead of UrlRequest.

c52c444: Add file: protocol handler.

                             [ Adrien Destugues <pulkomandy@xxxxxxxxxxxxx> ]

----------------------------------------------------------------------------

15 files changed, 317 insertions(+), 263 deletions(-)
headers/os/net/FileRequest.h                     |  29 +++++
headers/os/net/HttpRequest.h                     |  12 +-
headers/os/net/HttpResult.h                      |  55 +++++++++
headers/os/net/UrlRequest.h                      |  11 --
headers/os/net/UrlResult.h                       |  56 ---------
src/kits/network/libnetapi/FileRequest.cpp       |  56 +++++++++
src/kits/network/libnetapi/HttpRequest.cpp       |  55 ++++++---
src/kits/network/libnetapi/HttpResult.cpp        | 104 ++++++++++++++++
src/kits/network/libnetapi/Jamfile               |   5 +-
.../UrlProtocolAsynchronousListener.cpp          |  11 +-
.../libnetapi/UrlProtocolDispatchingListener.cpp |   6 +-
src/kits/network/libnetapi/UrlProtocolRoster.cpp |   6 +
src/kits/network/libnetapi/UrlRequest.cpp        |  51 +-------
src/kits/network/libnetapi/UrlResult.cpp         | 121 -------------------
.../network/libnetapi/UrlSynchronousRequest.cpp  |   2 -

############################################################################

Commit:      f6782201f0dd84204dacf7b1f018f56d9594d972
URL:         http://cgit.haiku-os.org/haiku/commit/?id=f678220
Author:      Adrien Destugues <pulkomandy@xxxxxxxxxxxxx>
Date:        Thu Oct 24 15:26:17 2013 UTC

Move UrlResult to HttpResult

 * Remove the fRawData field, as handling it is too complicated (it's
not easy to have proper copy semantics on a BDataIO) and it's not used
anyway, as the listener DataReceived call is enough to get the data and
handle it.
 * All the remaining fields are HTTP-only, so rename the class to
HttpResult and attach it to HttpRequest instead of UrlRequest.

----------------------------------------------------------------------------

diff --git a/headers/os/net/HttpRequest.h b/headers/os/net/HttpRequest.h
index b55ce59..2c4248c 100644
--- a/headers/os/net/HttpRequest.h
+++ b/headers/os/net/HttpRequest.h
@@ -12,6 +12,7 @@
 #include <HttpAuthentication.h>
 #include <HttpForm.h>
 #include <HttpHeaders.h>
+#include <HttpResult.h>
 #include <NetBuffer.h>
 #include <NetworkAddress.h>
 #include <UrlRequest.h>
@@ -48,6 +49,9 @@ public:
                                                                        const 
ssize_t size = -1);
             void                AdoptHeaders(BHttpHeaders* const headers);
 
+                       const BHttpResult&      Result() const;
+                       const char*                     StatusString(status_t 
threadStatus) const;
+
        static  bool                            IsInformationalStatusCode(int16 
code);
        static  bool                            IsSuccessStatusCode(int16 code);
        static  bool                            IsRedirectionStatusCode(int16 
code);
@@ -55,8 +59,6 @@ public:
        static  bool                            IsServerErrorStatusCode(int16 
code);
        static  int16                           StatusCodeClass(int16 code);
 
-       virtual const char*                     StatusString(status_t 
threadStatus) const;
-
 private:
                        void                            _ResetOptions();
                        status_t                        _ProtocolLoop();
@@ -73,6 +75,11 @@ private:
 
                        void                            
_AddOutputBufferLine(const char* line);
 
+       // URL result parameters access
+                       BPositionIO*                    _ResultRawData();
+                       BHttpHeaders&                   _ResultHeaders();
+                       void                                    
_SetResultStatusCode(int32 statusCode);
+                       BString&                                
_ResultStatusText();
 
 private:
                        BAbstractSocket*        fSocket;
@@ -91,6 +98,7 @@ private:
        // Request status
 
                        BHttpHeaders            fOutputHeaders;
+                       BHttpResult                     fResult;
 
                        // Request state/events
                        enum {
diff --git a/headers/os/net/HttpResult.h b/headers/os/net/HttpResult.h
new file mode 100644
index 0000000..88f5de0
--- /dev/null
+++ b/headers/os/net/HttpResult.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2010 Haiku Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _B_URL_RESULT_H_
+#define _B_URL_RESULT_H_
+
+
+#include <iostream>
+
+#include <DataIO.h>
+#include <HttpHeaders.h>
+#include <String.h>
+#include <Url.h>
+
+
+class BUrlRequest;
+
+
+class BHttpResult {
+                       friend class                            BHttpRequest;
+                       
+public:
+                                                                               
BHttpResult(const BUrl& url);
+                                                                               
BHttpResult(const BHttpResult& other);
+                                                                               
~BHttpResult();
+       
+       // Result parameters modifications
+                       void                                            
SetUrl(const BUrl& url);
+               
+       // Result parameters access
+                       const BUrl&                                     Url() 
const;
+
+       // HTTP-Specific stuff
+                       const BHttpHeaders&                     Headers() const;
+                       const BString&                          StatusText() 
const;
+                       int32                                           
StatusCode() const;
+       
+       // Result tests
+                       bool                                            
HasHeaders() const;
+                       
+       // Overloaded members
+                       BHttpResult&                                    
operator=(const BHttpResult& other);
+                                                                       
+private:
+                       BUrl                                            fUrl;
+                       
+                       // TODO: HTTP specific stuff should not live here.
+                       BHttpHeaders                            fHeaders;
+                       int32                                           
fStatusCode;
+                       BString                                         
fStatusString;
+};
+
+
+#endif // _B_URL_RESULT_H_
diff --git a/headers/os/net/UrlRequest.h b/headers/os/net/UrlRequest.h
index d0b2eb7..870b124 100644
--- a/headers/os/net/UrlRequest.h
+++ b/headers/os/net/UrlRequest.h
@@ -7,7 +7,6 @@
 
 
 #include <Url.h>
-#include <UrlResult.h>
 #include <UrlContext.h>
 #include <UrlProtocolListener.h>
 #include <OS.h>
@@ -30,13 +29,11 @@ public:
 
        // URL protocol parameters modification
                        status_t                                SetUrl(const 
BUrl& url);
-                       status_t                                
SetResult(BUrlResult& result);
                        status_t                                
SetContext(BUrlContext* context);
                        status_t                                
SetListener(BUrlProtocolListener* listener);
 
        // URL protocol parameters access
                        const BUrl&                             Url() const;
-                       const BUrlResult&               Result() const;
                        BUrlContext*                    Context() const;
                        BUrlProtocolListener*   Listener() const;
                        const BString&                  Protocol() const;
@@ -53,16 +50,8 @@ protected:
        virtual status_t                                _ProtocolLoop();
        virtual void                                    
_EmitDebug(BUrlProtocolDebugMessage type,
                                                                                
const char* format, ...);
-
-       // URL result parameters access
-                       BMallocIO&                              
_ResultRawData();
-                       BHttpHeaders&                   _ResultHeaders();
-                       void                                    
_SetResultStatusCode(int32 statusCode);
-                       BString&                                
_ResultStatusText();
-
 protected:
                        BUrl                                    fUrl;
-                       BUrlResult                              fResult;
                        BUrlContext*                    fContext;
                        BUrlProtocolListener*   fListener;
 
diff --git a/headers/os/net/UrlResult.h b/headers/os/net/UrlResult.h
deleted file mode 100644
index 773e88b..0000000
--- a/headers/os/net/UrlResult.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2010 Haiku Inc. All rights reserved.
- * Distributed under the terms of the MIT License.
- */
-#ifndef _B_URL_RESULT_H_
-#define _B_URL_RESULT_H_
-
-
-#include <iostream>
-
-#include <DataIO.h>
-#include <HttpHeaders.h>
-#include <String.h>
-#include <Url.h>
-
-
-class BUrlRequest;
-
-
-class BUrlResult {
-                       friend class            BUrlRequest;
-                       
-public:
-                                                               
BUrlResult(const BUrl& url);
-                                                               
BUrlResult(const BUrlResult& other);
-       
-       // Result parameters modifications
-                       void                            SetUrl(const BUrl& url);
-               
-       // Result parameters access
-                       const BUrl&                     Url() const;
-                       const BMallocIO&        RawData() const;                
        
-                       const BHttpHeaders&     Headers() const;
-                       const BString&          StatusText() const;
-                       int32                           StatusCode() const;
-       
-       // Result tests
-                       bool                            HasHeaders() const;
-                       
-       // Overloaded members
-                       BUrlResult&                     operator=(const 
BUrlResult& other);
-       friend  std::ostream&           operator<<(std::ostream& out,
-                                                                       const 
BUrlResult& result);
-                                                                       
-private:
-                       BUrl                            fUrl;
-                       BMallocIO                       fRawData;
-                       BHttpHeaders            fHeaders;
-                               // TODO: HTTP specific stuff should not live 
here.
-
-                       int32                           fStatusCode;
-                       BString                         fStatusString;
-};
-
-
-#endif // _B_URL_RESULT_H_
diff --git a/src/kits/network/libnetapi/HttpRequest.cpp 
b/src/kits/network/libnetapi/HttpRequest.cpp
index 2e3e0bd..7b19990 100644
--- a/src/kits/network/libnetapi/HttpRequest.cpp
+++ b/src/kits/network/libnetapi/HttpRequest.cpp
@@ -20,7 +20,7 @@
 #include <HttpRequest.h>
 
 
-static const int32 kHttpProtocolReceiveBufferSize = 1024;
+static const int32 kHttpBufferSize = 4096;
 static const char* kHttpProtocolThreadStrStatus[
                B_PROT_HTTP_THREAD_STATUS__END - B_PROT_THREAD_STATUS__END]
        =  {
@@ -36,6 +36,7 @@ BHttpRequest::BHttpRequest(const BUrl& url, bool ssl, const 
char* protocolName,
        fSSL(ssl),
        fRequestMethod(B_HTTP_GET),
        fHttpVersion(B_HTTP_11),
+       fResult(url),
        fRequestStatus(kRequestInitialState),
        fOptHeaders(NULL),
        fOptPostFields(NULL),
@@ -244,6 +245,13 @@ BHttpRequest::StatusString(status_t threadStatus) const
 }
 
 
+const BHttpResult&
+BHttpRequest::Result() const
+{
+       return fResult;
+}
+
+
 void
 BHttpRequest::_ResetOptions()
 {
@@ -284,8 +292,6 @@ BHttpRequest::_ProtocolLoop()
                fOutputHeaders.Clear();
                fHeaders.Clear();
                _ResultHeaders().Clear();
-               _ResultRawData().Seek(SEEK_SET, 0);
-               _ResultRawData().SetSize(0);
 
                if (!_ResolveHostName()) {
                        _EmitDebug(B_URL_PROTOCOL_DEBUG_ERROR,
@@ -459,13 +465,15 @@ BHttpRequest::_MakeRequest()
                                                {
                                                        BFile 
upFile(currentField->File().Path(),
                                                                B_READ_ONLY);
-                                                       char readBuffer[1024];
+                                                       char 
readBuffer[kHttpBufferSize];
                                                        ssize_t readSize;
 
-                                                       readSize = 
upFile.Read(readBuffer, 1024);
+                                                       readSize = 
upFile.Read(readBuffer,
+                                                               
sizeof(readBuffer));
                                                        while (readSize > 0) {
                                                                
fSocket->Write(readBuffer, readSize);
-                                                               readSize = 
upFile.Read(readBuffer, 1024);
+                                                               readSize = 
upFile.Read(readBuffer,
+                                                                       
sizeof(readBuffer));
                                                        }
                                                }
                                                break;
@@ -486,7 +494,7 @@ BHttpRequest::_MakeRequest()
                && fOptInputData != NULL) {
 
                for(;;) {
-                       char outputTempBuffer[1024];
+                       char outputTempBuffer[kHttpBufferSize];
                        ssize_t read = fOptInputData->Read(outputTempBuffer,
                                sizeof(outputTempBuffer));
 
@@ -557,7 +565,7 @@ BHttpRequest::_MakeRequest()
                        _ParseHeaders();
 
                        if (fRequestStatus >= kRequestHeadersReceived) {
-                               receiveBufferSize = 
kHttpProtocolReceiveBufferSize;
+                               receiveBufferSize = kHttpBufferSize;
                                _ResultHeaders() = fHeaders;
 
                                //! ProtocolHook:HeadersReceived
@@ -651,16 +659,6 @@ BHttpRequest::_MakeRequest()
                                                bytesTotal);
                                }
 
-                               ssize_t dataWrite = 
_ResultRawData().Write(inputTempBuffer,
-                                       bytesRead);
-
-                               if (dataWrite != bytesRead) {
-                                       _EmitDebug(B_URL_PROTOCOL_DEBUG_ERROR,
-                                               "Unable to write %dbytes of 
data (%d).", bytesRead,
-                                               dataWrite);
-                                       return B_PROT_NO_MEMORY;
-                               }
-
                                if (bytesTotal > 0 && bytesReceived >= 
bytesTotal)
                                        receiveEnd = true;
 
@@ -896,3 +894,24 @@ BHttpRequest::_AddOutputBufferLine(const char* line)
        _EmitDebug(B_URL_PROTOCOL_DEBUG_HEADER_OUT, "%s", line);
        fOutputBuffer << line << "\r\n";
 }
+
+
+BHttpHeaders&
+BHttpRequest::_ResultHeaders()
+{
+       return fResult.fHeaders;
+}
+
+
+void
+BHttpRequest::_SetResultStatusCode(int32 statusCode)
+{
+       fResult.fStatusCode = statusCode;
+}
+
+
+BString&
+BHttpRequest::_ResultStatusText()
+{
+       return fResult.fStatusString;
+}
diff --git a/src/kits/network/libnetapi/HttpResult.cpp 
b/src/kits/network/libnetapi/HttpResult.cpp
new file mode 100644
index 0000000..6e48505
--- /dev/null
+++ b/src/kits/network/libnetapi/HttpResult.cpp
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2010 Haiku Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *             Christophe Huriaux, c.huriaux@xxxxxxxxx
+ */
+
+
+#include <HttpResult.h>
+#include <Debug.h>
+
+
+using std::ostream;
+
+
+BHttpResult::BHttpResult(const BUrl& url)
+       :
+       fUrl(url),
+       fHeaders(),
+       fStatusCode(0)
+{
+}
+
+
+BHttpResult::BHttpResult(const BHttpResult& other)
+       :
+       fUrl(other.fUrl),
+       fHeaders(other.fHeaders),
+       fStatusCode(other.fStatusCode),
+       fStatusString(other.fStatusString)
+{
+}
+
+
+BHttpResult::~BHttpResult()
+{
+}
+
+
+// #pragma mark Result parameters modifications
+
+
+void
+BHttpResult::SetUrl(const BUrl& url)
+{
+       fUrl = url;
+}
+
+
+// #pragma mark Result parameters access
+
+
+const BUrl&
+BHttpResult::Url() const
+{
+       return fUrl;
+}
+
+
+const BHttpHeaders&
+BHttpResult::Headers() const
+{
+       return fHeaders;
+}
+
+
+int32
+BHttpResult::StatusCode() const
+{
+       return fStatusCode;
+}
+
+
+const BString&
+BHttpResult::StatusText() const
+{
+       return fStatusString;
+}
+
+
+// #pragma mark Result tests
+
+
+bool
+BHttpResult::HasHeaders() const
+{
+       return (fHeaders.CountHeaders() > 0);
+}
+
+
+// #pragma mark Overloaded members
+
+
+BHttpResult&
+BHttpResult::operator=(const BHttpResult& other)
+{
+       fUrl = other.fUrl;
+       fHeaders = other.fHeaders;
+       fStatusCode = other.fStatusCode;
+       fStatusString = other.fStatusString;
+
+       return *this;
+}
diff --git a/src/kits/network/libnetapi/UrlProtocolAsynchronousListener.cpp 
b/src/kits/network/libnetapi/UrlProtocolAsynchronousListener.cpp
index b91d0fb..e23c33b 100644
--- a/src/kits/network/libnetapi/UrlProtocolAsynchronousListener.cpp
+++ b/src/kits/network/libnetapi/UrlProtocolAsynchronousListener.cpp
@@ -99,9 +99,14 @@ BUrlProtocolAsynchronousListener::MessageReceived(BMessage* 
message)
                case B_URL_PROTOCOL_DATA_RECEIVED:
                        {
                                const char* data;
-                               ssize_t         size;
-                               message->FindData("url:data", B_STRING_TYPE, 
-                                       reinterpret_cast<const void**>(&data), 
&size);
+                               ssize_t         size = 0;
+                               if(message->FindData("url:data", B_STRING_TYPE, 
+                                       reinterpret_cast<const void**>(&data), 
&size) != B_OK)
+                               {
+                                       printf("BOGUS DATA MESSAGE\n");
+                                       message->PrintToStream();
+                                       return;
+                               }
                                
                                DataReceived(caller, data, size);
                        }
diff --git a/src/kits/network/libnetapi/UrlProtocolDispatchingListener.cpp 
b/src/kits/network/libnetapi/UrlProtocolDispatchingListener.cpp
index 0043cfa..088f74e 100644
--- a/src/kits/network/libnetapi/UrlProtocolDispatchingListener.cpp
+++ b/src/kits/network/libnetapi/UrlProtocolDispatchingListener.cpp
@@ -10,6 +10,8 @@
 #include <UrlProtocolDispatchingListener.h>
 #include <Debug.h>
 
+#include <assert.h>
+
 
 const char* kUrlProtocolMessageType = "be:urlProtocolMessageType";
 const char* kUrlProtocolCaller = "be:urlProtocolCaller";
@@ -76,7 +78,9 @@ BUrlProtocolDispatchingListener::DataReceived(BUrlRequest* 
caller,
        const char* data, ssize_t size)
 {
        BMessage message(B_URL_PROTOCOL_NOTIFICATION);
-       message.AddData("url:data", B_STRING_TYPE, data, size, true, 1);
+       status_t result = message.AddData("url:data", B_STRING_TYPE, data, size,
+               true, 1);
+       assert(result == B_OK);
        
        _SendMessage(&message, B_URL_PROTOCOL_DATA_RECEIVED, caller);
 }
diff --git a/src/kits/network/libnetapi/UrlRequest.cpp 
b/src/kits/network/libnetapi/UrlRequest.cpp
index de51565..add7361 100644
--- a/src/kits/network/libnetapi/UrlRequest.cpp
+++ b/src/kits/network/libnetapi/UrlRequest.cpp
@@ -31,7 +31,6 @@ BUrlRequest::BUrlRequest(const BUrl& url, 
BUrlProtocolListener* listener,
        BUrlContext* context, const char* threadName, const char* protocolName)
        :
        fUrl(url),
-       fResult(url),
        fContext(context),
        fListener(listener),
        fQuit(false),
@@ -127,17 +126,6 @@ BUrlRequest::SetUrl(const BUrl& url)
 
 
 status_t
-BUrlRequest::SetResult(BUrlResult& result)
-{
-       if (IsRunning())
-               return B_ERROR;
-
-       fResult = result;
-       return B_OK;
-}
-
-
-status_t
 BUrlRequest::SetContext(BUrlContext* context)
 {
        if (IsRunning())
@@ -169,13 +157,6 @@ BUrlRequest::Url() const
 }
 
 
-const BUrlResult&
-BUrlRequest::Result() const
-{
-       return fResult;
-}
-
-
 BUrlContext*
 BUrlRequest::Context() const
 {
@@ -240,9 +221,11 @@ BUrlRequest::_ThreadEntry(void* arg)
        urlProtocol->fRunning = false;
        urlProtocol->fThreadStatus = protocolLoopExitStatus;
 
-       if (urlProtocol->fListener != NULL)
+       if (urlProtocol->fListener != NULL) {
                urlProtocol->fListener->RequestCompleted(urlProtocol,
                        protocolLoopExitStatus == B_PROT_SUCCESS);
+               printf("Notified to %p\n", urlProtocol->fListener);
+       }
 
        return B_OK;
 }
@@ -274,31 +257,3 @@ BUrlRequest::_EmitDebug(BUrlProtocolDebugMessage type,
        fListener->DebugMessage(this, type, debugMsg);
        va_end(arguments);
 }
-
-
-BMallocIO&
-BUrlRequest::_ResultRawData()
-{
-       return fResult.fRawData;
-}
-
-
-BHttpHeaders&
-BUrlRequest::_ResultHeaders()
-{
-       return fResult.fHeaders;
-}
-
-
-void
-BUrlRequest::_SetResultStatusCode(int32 statusCode)
-{
-       fResult.fStatusCode = statusCode;
-}
-
-
-BString&
-BUrlRequest::_ResultStatusText()
-{
-       return fResult.fStatusString;
-}
diff --git a/src/kits/network/libnetapi/UrlResult.cpp 
b/src/kits/network/libnetapi/UrlResult.cpp
deleted file mode 100644
index bdc20a4..0000000
--- a/src/kits/network/libnetapi/UrlResult.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright 2010 Haiku Inc. All rights reserved.
- * Distributed under the terms of the MIT License.
- *
- * Authors:
- *             Christophe Huriaux, c.huriaux@xxxxxxxxx
- */
-
-
-#include <UrlResult.h>
-#include <Debug.h>
-
-
-using std::ostream;
-
-
-BUrlResult::BUrlResult(const BUrl& url)
-       :
-       fUrl(url),
-       fRawData(),
-       fHeaders(),
-       fStatusCode(0)
-{
-}
-
-
-BUrlResult::BUrlResult(const BUrlResult& other)
-       :
-       fUrl(),
-       fRawData(),
-       fHeaders()
-{
-       *this = other;
-}
-
-
-// #pragma mark Result parameters modifications
-
-
-void
-BUrlResult::SetUrl(const BUrl& url)
-{
-       fUrl = url;
-}
-
-
-// #pragma mark Result parameters access
-
-
-const BUrl&
-BUrlResult::Url() const
-{
-       return fUrl;
-}
-
-
-const BMallocIO&
-BUrlResult::RawData() const
-{
-       return fRawData;
-}
-
-
-const BHttpHeaders&
-BUrlResult::Headers() const
-{
-       return fHeaders;
-}
-
-
-int32
-BUrlResult::StatusCode() const
-{
-       return fStatusCode;
-}
-
-
-const BString&
-BUrlResult::StatusText() const
-{
-       return fStatusString;
-}
-
-
-// #pragma mark Result tests
-
-
-bool
-BUrlResult::HasHeaders() const
-{
-       return (fHeaders.CountHeaders() > 0);
-}
-
-
-// #pragma mark Overloaded operators
-
-
-BUrlResult&
-BUrlResult::operator=(const BUrlResult& other)
-{
-       fUrl = other.fUrl;
-       fHeaders = other.fHeaders;
-       
-       fRawData.SetSize(other.fRawData.BufferLength());
-       fRawData.WriteAt(0, other.fRawData.Buffer(), 
other.fRawData.BufferLength());
-               // FIXME this makes a copy of the data, it would be better to 
share it
-
-       fStatusCode = other.fStatusCode;
-       
-       return *this;
-}
-
-
-ostream&       
-operator<<(ostream& out, const BUrlResult& result)
-{
-       out.write(reinterpret_cast<const char*>(result.fRawData.Buffer()),
-               result.fRawData.BufferLength());
-       
-       return out;
-}
diff --git a/src/kits/network/libnetapi/UrlSynchronousRequest.cpp 
b/src/kits/network/libnetapi/UrlSynchronousRequest.cpp
index 54437ee..c58479e 100644
--- a/src/kits/network/libnetapi/UrlSynchronousRequest.cpp
+++ b/src/kits/network/libnetapi/UrlSynchronousRequest.cpp
@@ -45,8 +45,6 @@ BUrlSynchronousRequest::WaitUntilCompletion()
        while (!fRequestComplete)
                snooze(10000);
 
-       fResult = fWrappedRequest.Result();
-
        return B_OK;
 }
 

############################################################################

Revision:    hrev46283
Commit:      c52c444c2733032679528e83572e8f2f6d576a13
URL:         http://cgit.haiku-os.org/haiku/commit/?id=c52c444
Author:      Adrien Destugues <pulkomandy@xxxxxxxxxxxxx>
Date:        Thu Oct 24 15:31:25 2013 UTC

Add file: protocol handler.

----------------------------------------------------------------------------

diff --git a/headers/os/net/FileRequest.h b/headers/os/net/FileRequest.h
new file mode 100644
index 0000000..49c5974
--- /dev/null
+++ b/headers/os/net/FileRequest.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2013 Haiku Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _B_FILE_REQUEST_H_
+#define _B_FILE_REQUEST_H_
+
+
+#include <deque>
+
+
+#include <UrlRequest.h>
+
+
+class BFileRequest : public BUrlRequest {
+public:
+                                                               
BFileRequest(const BUrl& url,
+                                                                       
BUrlProtocolListener* listener = NULL,
+                                                                       
BUrlContext* context = NULL);
+       virtual                                         ~BFileRequest();
+
+            void                SetDisableListener(bool disable);
+
+private:
+                       status_t                        _ProtocolLoop();
+};
+
+
+#endif // _B_FILE_REQUEST_H_
diff --git a/src/kits/network/libnetapi/FileRequest.cpp 
b/src/kits/network/libnetapi/FileRequest.cpp
new file mode 100644
index 0000000..a57b155
--- /dev/null
+++ b/src/kits/network/libnetapi/FileRequest.cpp
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2013 Haiku Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *             Adrien Destugues, pulkomandy@xxxxxxxxxxxxx
+ */
+
+
+#include <new>
+#include <stdlib.h>
+
+#include <arpa/inet.h>
+
+#include <File.h>
+#include <FileRequest.h>
+
+
+BFileRequest::BFileRequest(const BUrl& url, BUrlProtocolListener* listener,
+       BUrlContext* context)
+       :
+       BUrlRequest(url, listener, context, "BUrlProtocol.File", "file")
+{
+}
+
+
+BFileRequest::~BFileRequest()
+{
+}
+
+
+status_t
+BFileRequest::_ProtocolLoop()
+{
+       // FIXME error handling (file does not exists, etc.)
+       BFile file(fUrl.Path().String(), B_READ_ONLY); 
+
+       if(file.InitCheck() != B_OK)
+               return B_PROT_CONNECTION_FAILED;
+
+       // Send all notifications to listener, if any
+       if (fListener != NULL) {
+               fListener->ConnectionOpened(this);
+               off_t size = 0;
+               file.GetSize(&size);
+               fListener->DownloadProgress(this, size, size);
+
+               size_t chunkSize;
+               char chunk[4096];
+               while((chunkSize = file.Read(chunk, sizeof(chunk))) > 0)
+                       fListener->DataReceived(this, chunk, chunkSize);
+       }
+
+       return B_PROT_SUCCESS;
+}
+
diff --git a/src/kits/network/libnetapi/Jamfile 
b/src/kits/network/libnetapi/Jamfile
index ec079c2..bea137c 100644
--- a/src/kits/network/libnetapi/Jamfile
+++ b/src/kits/network/libnetapi/Jamfile
@@ -58,8 +58,12 @@ for architectureObject in [ MultiArchSubDirSetup ] {
                        HttpHeaders.cpp
                        HttpForm.cpp
                        HttpRequest.cpp
+                       HttpResult.cpp
                        HttpTime.cpp
 
+                       # TODO: another add-on for file:// (a much simpler one)
+                       FileRequest.cpp
+
                        $(md5Sources)
 
                        Url.cpp
@@ -69,7 +73,6 @@ for architectureObject in [ MultiArchSubDirSetup ] {
                        UrlProtocolListener.cpp
                        UrlProtocolRoster.cpp
                        UrlRequest.cpp
-                       UrlResult.cpp
                        UrlSynchronousRequest.cpp
 
                        :
diff --git a/src/kits/network/libnetapi/UrlProtocolRoster.cpp 
b/src/kits/network/libnetapi/UrlProtocolRoster.cpp
index 2e2a6c9..830bd2b 100644
--- a/src/kits/network/libnetapi/UrlProtocolRoster.cpp
+++ b/src/kits/network/libnetapi/UrlProtocolRoster.cpp
@@ -12,6 +12,7 @@
 #include <new>
 
 #include <UrlRequest.h>
+#include <FileRequest.h>
 #include <HttpRequest.h>
 #include <Debug.h>
 
@@ -27,7 +28,12 @@ BUrlProtocolRoster::MakeRequest(const BUrl& url,
        } else if (url.Protocol() == "https") {
                return new(std::nothrow) BHttpRequest(url, true, "HTTPS", 
listener,
                        context);
+       } else if (url.Protocol() == "file") {
+               puts("*** FILE URL");
+               return new(std::nothrow) BFileRequest(url, listener, context);
        }
 
+       puts("*** UNKNOWN protocol");
+
        return NULL;
 }


Other related posts: