Cutelyst  2.13.0
Public Types | Public Member Functions | Protected Member Functions | Friends | List of all members
Cutelyst::Response Class Referencefinal
Inheritance diagram for Cutelyst::Response:
Inheritance graph
[legend]

Public Types

enum  CloseCode {
  CloseCodeNormal, CloseCodeGoingAway, CloseCodeProtocolError, CloseCodeDatatypeNotSupported,
  CloseCodeReserved1004, CloseCodeMissingStatusCode, CloseCodeAbnormalDisconnection, CloseCodeWrongDatatype,
  CloseCodePolicyViolated, CloseCodeTooMuchData, CloseCodeMissingExtension, CloseCodeBadOperation,
  CloseCodeTlsHandshakeFailed
}
 
enum  HttpStatus {
  Continue, SwitchingProtocols, OK, Created,
  Accepted, NonAuthoritativeInformation, NoContent, ResetContent,
  PartialContent, MultiStatus, MultipleChoices, MovedPermanently,
  Found, SeeOther, NotModified, UseProxy,
  TemporaryRedirect, PermanentRedirect, BadRequest, Unauthorized,
  PaymentRequired, Forbidden, NotFound, MethodNotAllowed,
  NotAcceptable, ProxyAuthenticationRequired, RequestTimeout, Conflict,
  Gone, LengthRequired, PreconditionFailed, RequestEntityTooLarge,
  RequestURITooLong, UnsupportedMediaType, RequestedRangeNotSatisfiable, ExpectationFailed,
  InternalServerError, NotImplemented, BadGateway, ServiceUnavailable,
  GatewayTimeout, HTTPVersionNotSupported, BandwidthLimitExceeded
}
 

Public Member Functions

Q_REQUIRED_RESULT QByteArray & body ()
 
QIODevice * bodyDevice () const
 
QString contentEncoding () const
 
qint64 contentLength () const
 
QString contentType () const
 
QString contentTypeCharset () const
 
QVariant cookie (const QByteArray &name) const
 
QList< QNetworkCookie > cookies () const
 
bool hasBody () const
 
QString header (const QString &field) const
 
Headersheaders ()
 
bool isFinalizedHeaders () const
 
virtual bool isSequential () const override
 
QUrl location () const
 
void redirect (const QString &url, quint16 status=Found)
 
void redirect (const QUrl &url, quint16 status=Found)
 
void redirectSafe (const QUrl &url, const QUrl &fallback)
 
int removeCookies (const QByteArray &name)
 
void setBody (const QByteArray &body)
 
void setBody (const QString &body)
 
void setBody (QIODevice *body)
 
void setContentEncoding (const QString &encoding)
 
void setContentLength (qint64 length)
 
void setContentType (const QString &type)
 
void setCookie (const QNetworkCookie &cookie)
 
void setCookies (const QList< QNetworkCookie > &cookies)
 
void setHeader (const QString &field, const QString &value)
 
void setJsonArrayBody (const QJsonArray &array)
 
void setJsonBody (const QByteArray &json)
 
void setJsonBody (const QJsonDocument &documment)
 
void setJsonBody (const QString &json)
 
void setJsonObjectBody (const QJsonObject &object)
 
void setStatus (quint16 status)
 
virtual qint64 size () const override
 
quint16 status () const
 
bool webSocketBinaryMessage (const QByteArray &message)
 Sends a WebSocket binary message.
 
bool webSocketClose (quint16 code=Response::CloseCodeNormal, const QString &reason=QString())
 Sends a WebSocket close frame, with both optional close code and a string reason. More...
 
bool webSocketHandshake (const QString &key=QString(), const QString &origin=QString(), const QString &protocol=QString())
 Sends the websocket handshake, if no parameters are defined it will use header data. More...
 
bool webSocketPing (const QByteArray &payload=QByteArray())
 Sends a WebSocket ping with an optional payload limited to 125 bytes, which will be truncated if larger. More...
 
bool webSocketTextMessage (const QString &message)
 Sends a WebSocket text message.
 

Protected Member Functions

 Response (const Headers &defaultHeaders, EngineRequest *conn=nullptr)
 
virtual qint64 readData (char *data, qint64 maxlen) override
 
virtual qint64 writeData (const char *data, qint64 len) override
 

Friends

class Application
 
class Context
 
class ContextPrivate
 
class Engine
 
class EngineConnection
 

Detailed Description

Definition at line 34 of file response.h.

Member Enumeration Documentation

◆ CloseCode

This enum type specifies the status response to be sent to the client

Definition at line 88 of file response.h.

◆ HttpStatus

This enum type specifies the status response to be sent to the client

Definition at line 40 of file response.h.

Constructor & Destructor Documentation

◆ Response()

Response::Response ( const Headers defaultHeaders,
EngineRequest conn = nullptr 
)
explicitprotected

Constructs a Response object, for this engine request and defaultHeaders.

Definition at line 32 of file response.cpp.

Member Function Documentation

◆ body()

QByteArray & Response::body ( )

This function returns a reference to a QByteArray which implicity sets the body device to a QBuffer, even if one was already set.

Definition at line 97 of file response.cpp.

Referenced by Cutelyst::EngineRequest::finalizeBody(), setBody(), setJsonArrayBody(), setJsonBody(), and setJsonObjectBody().

◆ bodyDevice()

QIODevice * Response::bodyDevice ( ) const

Returns the body IO device (if any) of this response.

Definition at line 108 of file response.cpp.

Referenced by Cutelyst::EngineRequest::finalizeBody().

◆ contentEncoding()

QString Response::contentEncoding ( ) const

Short for headers().contentEncoding();

Definition at line 172 of file response.cpp.

◆ contentLength()

qint64 Response::contentLength ( ) const

Short for headers().contentLength();

Definition at line 188 of file response.cpp.

◆ contentType()

QString Response::contentType ( ) const

Short for headers().contentType();

Definition at line 204 of file response.cpp.

Referenced by Cutelyst::RenderView::doExecute().

◆ contentTypeCharset()

QString Response::contentTypeCharset ( ) const

Short for headers().contentTypeCharset();

Definition at line 210 of file response.cpp.

◆ cookie()

QVariant Response::cookie ( const QByteArray &  name) const

Returns the first QNetworkCookie matching the name or a null QVariant if not found

Definition at line 216 of file response.cpp.

Referenced by setCookie(), and setCookies().

◆ cookies()

QList< QNetworkCookie > Response::cookies ( ) const

Returns a list of all cookies set

Definition at line 222 of file response.cpp.

Referenced by Cutelyst::EngineRequest::finalizeCookies(), and setCookies().

◆ hasBody()

bool Response::hasBody ( ) const

Returns true if a body device has been defined as QByteArray or QIODevice or write() was called and it's on chunked mode

Definition at line 91 of file response.cpp.

Referenced by Cutelyst::RenderView::doExecute().

◆ header()

QString Response::header ( const QString &  field) const

Shortcut headers().header()

Definition at line 300 of file response.cpp.

◆ headers()

Headers & Response::headers ( )

Returns a reference to the response headers class

Definition at line 316 of file response.cpp.

Referenced by Cutelyst::EngineRequest::finalizeCookies(), and Cutelyst::EngineRequest::finalizeHeaders().

◆ isFinalizedHeaders()

bool Response::isFinalizedHeaders ( ) const

Returns if Headers are finalized (sent to the client)

Definition at line 322 of file response.cpp.

◆ isSequential()

bool Response::isSequential ( ) const
overridevirtual

Writting to user-agent is always sequential

Definition at line 328 of file response.cpp.

◆ location()

QUrl Response::location ( ) const

Returns the HTTP location set by the redirect

Definition at line 294 of file response.cpp.

Referenced by redirect().

◆ readData()

qint64 Response::readData ( char *  data,
qint64  maxlen 
)
overrideprotectedvirtual

Reimplemented from QIODevice::readData().

Definition at line 38 of file response.cpp.

◆ redirect() [1/2]

void Response::redirect ( const QString &  url,
quint16  status = Found 
)

Causes the response to redirect to the specified URL. The default status is 302. This is a convenience method that sets the Location header to the redirect destination, and then sets the response status. You will want to return false or c->detach() to interrupt the normal processing flow if you want the redirect to occur straight away.

Note
do not give a relative URL as $url, i.e: one that is not fully qualified ("http://...", etc.) or that starts with a slash "/path/here". While it may work, it is not guaranteed to do the right thing and is not a standard behaviour. You may opt to use uriFor() or uriForAction() instead.

Definition at line 279 of file response.cpp.

References redirect(), and status().

Referenced by redirect().

◆ redirect() [2/2]

void Response::redirect ( const QUrl &  url,
quint16  status = Found 
)

Causes the response to redirect to the specified URL. The default status is 302. This is a convenience method that sets the Location header to the redirect destination, and then sets the response status. You will want to return false or c->detach() to interrupt the normal processing flow if you want the redirect to occur straight away.

Note
do not give a relative URL as $url, i.e: one that is not fully qualified ("http://...", etc.) or that starts with a slash "/path/here". While it may work, it is not guaranteed to do the right thing and is not a standard behaviour. You may opt to use uriFor() or uriForAction() instead.

Definition at line 248 of file response.cpp.

References location(), setBody(), and status().

Referenced by Cutelyst::LangSelect::fromPath(), and redirectSafe().

◆ redirectSafe()

void Response::redirectSafe ( const QUrl &  url,
const QUrl &  fallback 
)

Open Redirect Vulnerability is when you get an user provided URL and redirect to it without checking if it's safe.

This can be used on login forms that receive some "redir" parameter that once logged in allows the user to go straight to that page instead of some home page.

It's then possible to receive a link like http://example.com/login?redir=http://exemple.com/login notice how both domain names are similar for malicious porpuses, once logged in it redirects to a similar login page that will pretent the auth didn't work, user might then type their credentials on that page.

This method validades that the url scheme, domain name and port are the same of the request to your server if it isn't it will send the user to fallback url that you know it's safe. If you need to redirect the user to some other domain/port validate the URL manually an use the regular

See also
redirect method instead.

Definition at line 284 of file response.cpp.

References redirect().

◆ removeCookies()

int Response::removeCookies ( const QByteArray &  name)

Removes all cookies that matches name, returning the number of cookies removed

Definition at line 242 of file response.cpp.

◆ setBody() [1/3]

void Response::setBody ( const QByteArray &  body)

Sets a QByteArray as the response body, content length will be automatically set to it's size.

Definition at line 128 of file response.cpp.

References body().

◆ setBody() [2/3]

void Cutelyst::Response::setBody ( const QString &  body)
inline

Sets a QString as the response body, the output will be UTF-8 and content length will be automatically set to it's size.

Definition at line 406 of file response.h.

References setBody().

◆ setBody() [3/3]

void Response::setBody ( QIODevice *  body)

Sets an IO device as the response body, the open mode must be at least QIODevice::ReadOnly. This function takes ownership of your device deleting after the request has completed

Definition at line 114 of file response.cpp.

References body().

Referenced by Cutelyst::EngineRequest::finalizeError(), redirect(), Cutelyst::CuteleeView::render(), Cutelyst::GrantleeView::render(), and setBody().

◆ setContentEncoding()

void Cutelyst::Response::setContentEncoding ( const QString &  encoding)

Short for headers().setContentEncoding(encoding);

Definition at line 178 of file response.cpp.

◆ setContentLength()

void Response::setContentLength ( qint64  length)

Short for headers().setContentLength(length);

Definition at line 194 of file response.cpp.

◆ setContentType()

void Cutelyst::Response::setContentType ( const QString &  type)
inline

Short for headers().setContentType(type);

Definition at line 218 of file response.h.

Referenced by Cutelyst::RenderView::doExecute(), Cutelyst::EngineRequest::finalizeError(), and Cutelyst::ViewJson::render().

◆ setCookie()

void Response::setCookie ( const QNetworkCookie &  cookie)

Defines a QNetworkCookie to be sent to the user-agent, if a previous cookie->name() was set it will be replaced

Definition at line 228 of file response.cpp.

References cookie().

◆ setCookies()

void Response::setCookies ( const QList< QNetworkCookie > &  cookies)

Defines a list of QNetworkCookie to be sent to the user-agent, all previous matches to cookie->name() will be preserved.

Definition at line 234 of file response.cpp.

References cookie(), and cookies().

◆ setHeader()

void Response::setHeader ( const QString &  field,
const QString &  value 
)

Shortcut headers().setHeader()

Definition at line 306 of file response.cpp.

Referenced by Cutelyst::ViewJson::render().

◆ setJsonArrayBody()

void Response::setJsonArrayBody ( const QJsonArray &  array)

Sets a QJsonArray on a QJsonDocument as the response body, using toJson(QJsonDocument::Compact) output and setting content-type to application/json.

Definition at line 164 of file response.cpp.

References body().

◆ setJsonBody() [1/3]

void Response::setJsonBody ( const QByteArray &  json)

Sets a JSON string as the response body, this method is provided for convenience as it sets the content-type to application/json.

Definition at line 149 of file response.cpp.

◆ setJsonBody() [2/3]

void Response::setJsonBody ( const QJsonDocument &  documment)

Sets a QJsonDocument as the response body, using toJson(QJsonDocument::Compact) output and setting content-type to application/json.

Definition at line 134 of file response.cpp.

References body().

◆ setJsonBody() [3/3]

void Response::setJsonBody ( const QString &  json)

Sets a JSON string as the response body, this method is provided for convenience as it sets the content-type to application/json.

Definition at line 142 of file response.cpp.

◆ setJsonObjectBody()

void Response::setJsonObjectBody ( const QJsonObject &  object)

Sets a QJsonObject on a QJsonDocument as the response body, using toJson(QJsonDocument::Compact) output and setting content-type to application/json.

Definition at line 156 of file response.cpp.

References body().

◆ setStatus()

void Response::setStatus ( quint16  status)

Sets the response code status

Definition at line 85 of file response.cpp.

References status().

Referenced by Cutelyst::RenderView::doExecute(), and Cutelyst::EngineRequest::finalizeError().

◆ size()

qint64 Response::size ( ) const
overridevirtual

Reimplemented from QIODevice::readData().

Definition at line 333 of file response.cpp.

Referenced by Cutelyst::EngineRequest::finalizeHeaders().

◆ status()

quint16 Response::status ( ) const

The current response code status

Definition at line 79 of file response.cpp.

Referenced by Cutelyst::RenderView::doExecute(), Cutelyst::EngineRequest::finalizeHeaders(), redirect(), and setStatus().

◆ webSocketClose()

bool Response::webSocketClose ( quint16  code = Response::CloseCodeNormal,
const QString &  reason = QString() 
)
Note
This method does not emit Request::webSocketClosed() signal. If you need to track when the connection was closed, the proper way is to rely on Context::destroyed() signal.

Definition at line 369 of file response.cpp.

◆ webSocketHandshake()

bool Response::webSocketHandshake ( const QString &  key = QString(),
const QString &  origin = QString(),
const QString &  protocol = QString() 
)

Returns true in case of success, false otherwise, which can be due missing support on the engine or missing the appropriate headers.

Note
Most WebSockets client doesn't handle when a call to a WebSocket endpoint ends on an HTTP authentication failure or other HTTP status that is not the update. Due that it's best to always do the proper websocket handshake and then
See also
webSocketClose() the connection, with some meaning reason.

Definition at line 345 of file response.cpp.

◆ webSocketPing()

bool Response::webSocketPing ( const QByteArray &  payload = QByteArray())
Note
Some front-end servers will close the conetion if no activity is seem, NGINX closes in 60 seconds by default, in order to avoid that, sending a ping is the best to way to keep the connection alive and to know that your client is still there.

Definition at line 363 of file response.cpp.

◆ writeData()

qint64 Response::writeData ( const char *  data,
qint64  len 
)
overrideprotectedvirtual

Writes data to the response body, this will flush all response headers first and will enter in chunked mode if Transfer-Encoding header is set to chunked or if no content length is set and status is not 1xx or 204 (NoContent) or 304 (NotModified)

Definition at line 45 of file response.cpp.