Bug 945533 - Convert various websocket code to mozilla/Endian.h. r=jduell

--HG--
extra : rebase_source : daf0ee75f70bd86952cf39192d5287657881e9c9
This commit is contained in:
Jeff Walden 2013-05-04 22:22:55 -07:00
Родитель bf7c0aed08
Коммит 63d24e1e27
1 изменённых файлов: 16 добавлений и 24 удалений

Просмотреть файл

@ -7,6 +7,11 @@
#include "WebSocketLog.h" #include "WebSocketLog.h"
#include "WebSocketChannel.h" #include "WebSocketChannel.h"
#include "mozilla/Atomics.h"
#include "mozilla/Attributes.h"
#include "mozilla/Endian.h"
#include "mozilla/MathAlgorithms.h"
#include "nsIURI.h" #include "nsIURI.h"
#include "nsIChannel.h" #include "nsIChannel.h"
#include "nsICryptoHash.h" #include "nsICryptoHash.h"
@ -40,9 +45,6 @@
#include "nsAlgorithm.h" #include "nsAlgorithm.h"
#include "nsProxyRelease.h" #include "nsProxyRelease.h"
#include "nsNetUtil.h" #include "nsNetUtil.h"
#include "mozilla/Atomics.h"
#include "mozilla/Attributes.h"
#include "mozilla/MathAlgorithms.h"
#include "mozilla/Telemetry.h" #include "mozilla/Telemetry.h"
#include "mozilla/TimeStamp.h" #include "mozilla/TimeStamp.h"
@ -1232,9 +1234,7 @@ WebSocketChannel::ProcessInput(uint8_t *buffer, uint32_t count)
} }
// copy this in case it is unaligned // copy this in case it is unaligned
uint64_t tempLen; payloadLength64 = NetworkEndian::readInt64(mFramePtr + 2);
memcpy(&tempLen, mFramePtr + 2, 8);
payloadLength64 = PR_ntohll(tempLen);
} }
payload = mFramePtr + framingLength; payload = mFramePtr + framingLength;
@ -1259,9 +1259,7 @@ WebSocketChannel::ProcessInput(uint8_t *buffer, uint32_t count)
// frames to the client, but it is allowed // frames to the client, but it is allowed
LOG(("WebSocketChannel:: Client RECEIVING masked frame.")); LOG(("WebSocketChannel:: Client RECEIVING masked frame."));
uint32_t mask; uint32_t mask = NetworkEndian::readUint32(payload - 4);
memcpy(&mask, payload - 4, 4);
mask = PR_ntohl(mask);
ApplyMask(mask, payload, payloadLength); ApplyMask(mask, payload, payloadLength);
} }
@ -1375,8 +1373,7 @@ WebSocketChannel::ProcessInput(uint8_t *buffer, uint32_t count)
mServerCloseCode = CLOSE_NO_STATUS; mServerCloseCode = CLOSE_NO_STATUS;
if (payloadLength >= 2) { if (payloadLength >= 2) {
memcpy(&mServerCloseCode, payload, 2); mServerCloseCode = NetworkEndian::readUint16(payload);
mServerCloseCode = PR_ntohs(mServerCloseCode);
LOG(("WebSocketChannel:: close recvd code %u\n", mServerCloseCode)); LOG(("WebSocketChannel:: close recvd code %u\n", mServerCloseCode));
uint16_t msglen = static_cast<uint16_t>(payloadLength - 2); uint16_t msglen = static_cast<uint16_t>(payloadLength - 2);
if (msglen > 0) { if (msglen > 0) {
@ -1524,10 +1521,10 @@ WebSocketChannel::ApplyMask(uint32_t mask, uint8_t *data, uint64_t len)
uint32_t *iData = (uint32_t *) data; uint32_t *iData = (uint32_t *) data;
uint32_t *end = iData + (len / 4); uint32_t *end = iData + (len / 4);
mask = PR_htonl(mask); NetworkEndian::writeUint32(&mask, mask);
for (; iData < end; iData++) for (; iData < end; iData++)
*iData ^= mask; *iData ^= mask;
mask = PR_ntohl(mask); mask = NetworkEndian::readUint32(&mask);
data = (uint8_t *)iData; data = (uint8_t *)iData;
len = len % 4; len = len % 4;
@ -1657,8 +1654,7 @@ WebSocketChannel::PrimeNewOutgoingMessage()
// and there isn't an internal error, use that. // and there isn't an internal error, use that.
if (NS_SUCCEEDED(mStopOnClose)) { if (NS_SUCCEEDED(mStopOnClose)) {
if (mScriptCloseCode) { if (mScriptCloseCode) {
uint16_t temp = PR_htons(mScriptCloseCode); NetworkEndian::writeUint16(payload, mScriptCloseCode);
memcpy(payload, &temp, 2);
mOutHeader[1] += 2; mOutHeader[1] += 2;
mHdrOutToSend = 8; mHdrOutToSend = 8;
if (!mScriptCloseReason.IsEmpty()) { if (!mScriptCloseReason.IsEmpty()) {
@ -1677,8 +1673,7 @@ WebSocketChannel::PrimeNewOutgoingMessage()
mHdrOutToSend = 6; mHdrOutToSend = 6;
} }
} else { } else {
uint16_t temp = PR_htons(ResultToCloseCode(mStopOnClose)); NetworkEndian::writeUint16(payload, ResultToCloseCode(mStopOnClose));
memcpy(payload, &temp, 2);
mOutHeader[1] += 2; mOutHeader[1] += 2;
mHdrOutToSend = 8; mHdrOutToSend = 8;
} }
@ -1737,14 +1732,12 @@ WebSocketChannel::PrimeNewOutgoingMessage()
mHdrOutToSend = 6; mHdrOutToSend = 6;
} else if (mCurrentOut->Length() <= 0xffff) { } else if (mCurrentOut->Length() <= 0xffff) {
mOutHeader[1] = 126 | kMaskBit; mOutHeader[1] = 126 | kMaskBit;
((uint16_t *)mOutHeader)[1] = NetworkEndian::writeUint16(mOutHeader + sizeof(uint16_t),
PR_htons(mCurrentOut->Length()); mCurrentOut->Length());
mHdrOutToSend = 8; mHdrOutToSend = 8;
} else { } else {
mOutHeader[1] = 127 | kMaskBit; mOutHeader[1] = 127 | kMaskBit;
uint64_t tempLen = mCurrentOut->Length(); NetworkEndian::writeUint64(mOutHeader + 2, mCurrentOut->Length());
tempLen = PR_htonll(tempLen);
memcpy(mOutHeader + 2, &tempLen, 8);
mHdrOutToSend = 14; mHdrOutToSend = 14;
} }
payload = mOutHeader + mHdrOutToSend; payload = mOutHeader + mHdrOutToSend;
@ -1766,8 +1759,7 @@ WebSocketChannel::PrimeNewOutgoingMessage()
mask = * reinterpret_cast<uint32_t *>(buffer); mask = * reinterpret_cast<uint32_t *>(buffer);
NS_Free(buffer); NS_Free(buffer);
} while (!mask); } while (!mask);
uint32_t temp = PR_htonl(mask); NetworkEndian::writeUint32(payload - sizeof(uint32_t), mask);
memcpy(payload - 4, &temp, 4);
LOG(("WebSocketChannel::PrimeNewOutgoingMessage() using mask %08x\n", mask)); LOG(("WebSocketChannel::PrimeNewOutgoingMessage() using mask %08x\n", mask));