diff options
author | Milian Wolff <milian.wolff@kdab.com> | 2013-10-23 10:27:26 +0200 |
---|---|---|
committer | Pierre Rossi <pierre.rossi@gmail.com> | 2013-11-01 13:57:51 +0100 |
commit | 081b8783a946b70a461219a2e40caed2761f6812 (patch) | |
tree | 8d2cef3895358eabbb97d12629ebc3262f1fe8a4 | |
parent | 04a84b7b47e3b9dcc0d6e5c55fda394b73e65bff (diff) | |
download | qtwebchannel-081b8783a946b70a461219a2e40caed2761f6812.tar.gz |
Optimize: create the web socket header only once.
For channels with multiple clients we used to create it once for
every client which is not needed.
Change-Id: Ib1be0c9f7bc78c0415fe2e9f6f8aa5112d0156c6
Reviewed-by: Pierre Rossi <pierre.rossi@gmail.com>
-rw-r--r-- | src/qwebsocketserver.cpp | 23 | ||||
-rw-r--r-- | src/qwebsocketserver.h | 1 |
2 files changed, 13 insertions, 11 deletions
diff --git a/src/qwebsocketserver.cpp b/src/qwebsocketserver.cpp index 2f46247..334d1a5 100644 --- a/src/qwebsocketserver.cpp +++ b/src/qwebsocketserver.cpp @@ -310,7 +310,7 @@ void QWebSocketServer::handleFrame(QTcpSocket* socket, Frame& frame) // do nothing break; case Frame::Ping: - sendFrame(socket, Frame::Pong, QByteArray()); + socket->write(frameHeader(Frame::Pong, 0)); break; case Frame::Pong: emit pongReceived(); @@ -342,7 +342,7 @@ void QWebSocketServer::close(QTcpSocket* socket, const HeaderData& header) { if (header.wasUpgraded) { //TODO: implement this properly - see http://tools.ietf.org/html/rfc6455#page-36 - sendFrame(socket, Frame::ConnectionClose, QByteArray()); + socket->write(frameHeader(Frame::Frame::ConnectionClose, 0)); } else { socket->write("HTTP/1.1 400 Bad Request\r\n"); } @@ -382,17 +382,19 @@ void QWebSocketServer::sendMessage(const QString& message) void QWebSocketServer::sendFrame(Frame::Opcode opcode, const QByteArray& data) { + const QByteArray& header = frameHeader(opcode, data.size()); QHash< QTcpSocket*, Connection >::const_iterator it = m_connections.constBegin(); while (it != m_connections.constEnd()) { if (it.value().header.wasUpgraded) { - sendFrame(it.key(), opcode, data); + it.key()->write(header); + it.key()->write(data); } ++it; } } // see: http://tools.ietf.org/html/rfc6455#page-28 -void QWebSocketServer::sendFrame(QTcpSocket* socket, Frame::Opcode opcode, const QByteArray& data) +QByteArray QWebSocketServer::frameHeader(QWebSocketServer::Frame::Opcode opcode, const int dataSize) const { // we only support single frames for now Q_ASSERT(opcode != Frame::ContinuationFrame); @@ -400,17 +402,16 @@ void QWebSocketServer::sendFrame(QTcpSocket* socket, Frame::Opcode opcode, const QByteArray header; header.reserve(4); header.append(FIN_BIT | opcode); - if (data.size() < EXTENDED_PAYLOAD) { - header.append(static_cast<char>(data.size())); - } else if (data.size() < std::numeric_limits<quint16>::max()) { + if (dataSize < EXTENDED_PAYLOAD) { + header.append(static_cast<char>(dataSize)); + } else if (dataSize < std::numeric_limits<quint16>::max()) { header.append(EXTENDED_PAYLOAD); - appendBytes(header, qToBigEndian<quint16>(data.size())); + appendBytes(header, qToBigEndian<quint16>(dataSize)); } else { header.append(EXTENDED_LONG_PAYLOAD); - appendBytes(header, qToBigEndian<quint64>(data.size())); + appendBytes(header, qToBigEndian<quint64>(dataSize)); } - socket->write(header); - socket->write(data); + return header; } void QWebSocketServer::ping() diff --git a/src/qwebsocketserver.h b/src/qwebsocketserver.h index 774f318..4a5b281 100644 --- a/src/qwebsocketserver.h +++ b/src/qwebsocketserver.h @@ -149,6 +149,7 @@ private: void sendFrame(Frame::Opcode opcode, const QByteArray& data); void sendFrame(QTcpSocket* socket, Frame::Opcode opcode, const QByteArray& data); + QByteArray frameHeader(Frame::Opcode opcode, const int dataSize) const; QTcpServer* m_server; QHash<QTcpSocket*, Connection> m_connections; |