kristall/src/protocolhandler.hpp

77 lines
2.8 KiB
C++

#ifndef GENERICPROTOCOLCLIENT_HPP
#define GENERICPROTOCOLCLIENT_HPP
#include "cryptoidentity.hpp"
#include <QObject>
#include <QAbstractSocket>
enum class RequestState : int;
class ProtocolHandler : public QObject
{
Q_OBJECT
public:
enum NetworkError {
UnknownError, //!< There was an unhandled network error
ProtocolViolation, //!< The server responded with something unexpected and violated the protocol
HostNotFound, //!< The host was not found by the client
ConnectionRefused, //!< The host refused connection on that port
ResourceNotFound, //!< The requested resource was not found on the server
BadRequest, //!< Our client misbehaved and did a request the server cannot understand
ProxyRequest, //!< We requested a proxy operation, but the server does not allow that
InternalServerError,
InvalidClientCertificate,
UntrustedHost, //!< We don't know the host, and we don't trust it
MistrustedHost, //!< We know the host and it's not the server identity we've seen before
Unauthorized, //!< The requested resource could not be accessed.
TlsFailure, //!< Unspecified TLS failure
Timeout, //!< The network connection timed out.
};
enum RequestOptions {
Default = 0,
IgnoreTlsErrors = 1,
};
public:
explicit ProtocolHandler(QObject *parent = nullptr);
virtual bool supportsScheme(QString const & scheme) const = 0;
virtual bool startRequest(QUrl const & url, RequestOptions options) = 0;
virtual bool isInProgress() const = 0;
virtual bool cancelRequest() = 0;
virtual bool enableClientCertificate(CryptoIdentity const & ident);
virtual void disableClientCertificate();
signals:
//! We successfully transferred some bytes from the server
void requestProgress(qint64 transferred);
//! The request completed with the given data and mime type
void requestComplete(QByteArray const & data, QString const & mime);
//! The state of the request has changed
void requestStateChange(RequestState state);
//! Server redirected us to another URL
void redirected(QUrl const & uri, bool is_permanent);
//! The server needs some information from the user to process this query.
void inputRequired(QString const & user_query, bool is_sensitive);
//! There was an error while processing the request
void networkError(NetworkError error, QString const & reason);
//! The server wants us to use a client certificate
void certificateRequired(QString const & info);
//! The server uses TLS and has a certificate.
void hostCertificateLoaded(QSslCertificate const & cert);
protected:
void emitNetworkError(QAbstractSocket::SocketError error_code, QString const & textual_description);
};
#endif // GENERICPROTOCOLCLIENT_HPP