summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilian Wolff <milian.wolff@kdab.com>2013-10-23 10:27:26 +0200
committerPierre Rossi <pierre.rossi@gmail.com>2013-11-01 13:57:51 +0100
commit081b8783a946b70a461219a2e40caed2761f6812 (patch)
tree8d2cef3895358eabbb97d12629ebc3262f1fe8a4
parent04a84b7b47e3b9dcc0d6e5c55fda394b73e65bff (diff)
downloadqtwebchannel-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.cpp23
-rw-r--r--src/qwebsocketserver.h1
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;