libbnetapi: BUrlRequest now outputs to BDataIO

Previously, BUrlRequest returns data received via a callback that can't
return any value. This approach have several issues:

- It's not possible to signify failures to the request.
- Users have to implement custom listeners just to handle the common
  case of outputting to a buffer/file/etc.
- The received data has to be serialized into BMessage when
  BUrlProtocolDispatchingListener is employed. This can cause a
  noticible slowdown in real-world scenarios as evident by #10748.

With this change, BUrlRequest will output directly into a BDataIO, which
exposes a richer API for request handlers to work with (for example a
BitTorrent client can request a BPositionIO for non-linear data
delivery), as well as simplifying common cases for users.

The adaptation only requires one additional API:
BHttpRequest::SetStopOnError(). This API simply instructs the HTTP
request handler to cancel the request if an HTTP error is occurred.

Change-Id: I4160884d77bff0e7678e0a623e2587987704443a
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3084
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
Leorize
2021-02-28 20:39:31 +00:00
committed by Niels Sascha Reedijk
parent 3e27f8d5a7
commit 78b1442051
39 changed files with 1562 additions and 452 deletions
+3 -1
View File
@@ -27,10 +27,12 @@
/*!
\fn static BUrlRequest* BUrlProtocolRoster::MakeRequest(const BUrl& url,
BUrlProtocolListener* listener = NULL, BUrlContext* context = NULL)
BDataIO* output, BUrlProtocolListener* listener = NULL,
BUrlContext* context = NULL)
\brief Create a BUrlRequest that can handle the given BUrl
\param url The URL to create a request for
\param output The BDataIO to output to
\param listener The BUrlProtocolListener to be registered with the created
BUrlRequest, can be \c NULL
\param context The BUrlContext to be registered with the created