HttpClient.h header
#include <ew/app/net/HttpClient.h>
Namespace ew::app::net
HttpClient class
class ew::app::net::HttpClient
Fetches bytes over HTTP. An interface so libs/app and the UI can express "download this" without depending on a network stack (docs/LOCAL_ENGINEERING_RUN.md section 4.1) – the implementation lives in libs/cloud, the only module that has one.
Members
ew::app::net::HttpClient::HttpClient()=default
Defaulted.
virtual ew::app::net::HttpClient::~HttpClient()=default
Defaulted.
ew::app::net::HttpClient::HttpClient(const HttpClient &)=delete
Interface type: non-copyable and non-movable (held via pointer).
ew::app::net::HttpClient::HttpClient(HttpClient &&)=delete
Not movable.
HttpClient & ew::app::net::HttpClient::operator=(const HttpClient &)=delete
Not copyable.
HttpClient & ew::app::net::HttpClient::operator=(HttpClient &&)=delete
Not movable.
virtual std::unique_ptr< HttpRequest > ew::app::net::HttpClient::get(const QString &url, std::function< void(HttpResult)> onFinished, std::function< void(qint64 received, qint64 total)> onProgress={})=0
GETs url, calling onFinished when it ends and onProgress (when supplied) as bytes arrive. Asynchronous: it returns immediately and the callbacks run on the calling thread's event loop, which is what lets the caller stay a UI object without blocking.
onProgress receives bytes-received and bytes-total, where total is -1 while the server has not said. Returns the handle; letting it go out of scope cancels the request.
virtual std::unique_ptr< HttpRequest > ew::app::net::HttpClient::post(const QString &url, const QString &contentType, const QByteArray &body, std::function< void(HttpResult)> onFinished)=0
POSTs body to url with content type contentType, calling onFinished when it ends. Asynchronous on the same terms as get().
Separate from get() rather than a verb parameter, because the two differ in what the caller must supply: a POST has a body and a content type and a GET has neither, and folding them together would make every GET caller pass two empty arguments to say "not applicable".
There is no progress callback: the payloads this exists for – a webhook notification, an API call – are small enough that progress is noise, and an upload nobody is watching does not need one. Returns the handle; letting it go out of scope cancels the request.
HttpRequest class
class ew::app::net::HttpRequest
A request already in flight. Destroying the handle cancels it, so a caller that drops the handle cannot leave a request running against an object that has gone away.
Members
ew::app::net::HttpRequest::HttpRequest()=default
Defaulted.
virtual ew::app::net::HttpRequest::~HttpRequest()=default
Cancels the request if it is still running.
ew::app::net::HttpRequest::HttpRequest(const HttpRequest &)=delete
Interface type: non-copyable and non-movable (held via pointer).
ew::app::net::HttpRequest::HttpRequest(HttpRequest &&)=delete
Not movable.
HttpRequest & ew::app::net::HttpRequest::operator=(const HttpRequest &)=delete
Not copyable.
HttpRequest & ew::app::net::HttpRequest::operator=(HttpRequest &&)=delete
Not movable.
virtual void ew::app::net::HttpRequest::cancel()=0
Aborts the request. The completion callback still runs, with HttpResult::cancelled set.
HttpResult struct
struct ew::app::net::HttpResult
How a request ended.
Members
bool ew::app::net::HttpResult::ok = false
True when the body arrived intact.
QByteArray ew::app::net::HttpResult::body
The response body. Set on success, and ALSO on an HTTP error status – a server that refuses usually explains why in the body, and discarding it leaves the caller unable to tell one refusal from another.
int ew::app::net::HttpResult::statusCode = 0
The HTTP status code, or 0 when the request never got a response at all (no network, DNS failure, timeout, cancellation).
THE ZERO MATTERS AS MUCH AS THE NUMBER. "The server said no" and "there was no server" call for opposite words to a user – one is a state of their account, the other is a state of their connection – and without this field they are the same ok == false. The beta channel needs exactly that distinction: a 403 means a tester's access ended and should say so, while a failure to connect must stay silent, because an automatic check that cannot reach the network is not an event worth interrupting anyone for.
QString ew::app::net::HttpResult::error
A human-readable failure message, when not ok.
bool ew::app::net::HttpResult::cancelled = false
True when the caller cancelled it rather than it failing. Kept separate from error because a cancelled download is not something to report to the user as a problem – they already know, having asked for it.
Functions
std::unique_ptr< HttpClient > ew::app::net::makeHttpClient()
Builds the HTTP client this build ships with, or null when it ships none.
The same seam as ew::app::ai::makeAiProvider, and the same two definitions: libs/cloud when EW_ENABLE_CLOUD is on, libs/app/src/net/NoCloudHttpClient.cpp when it is off.
Null here, unlike the AI provider, is the honest answer. An AI provider that reports itself unconfigured is a state the UI already renders; a fetch has no equivalent – there is nothing meaningful to hand back but "this build cannot". Callers check once, at the point they would have started a request, and simply do not offer the feature.