@@ -54,7 +54,7 @@ void encode_websocket_frames(std::vector<uv_buf_t>& outputs, char const* src, si
5454 int maskSize = mask ? 4 : 0 ;
5555
5656 if (size < 126 ) {
57- headerSize = sizeof (WebSocketFrameTiny);
57+ headerSize = sizeof (WebSocketFrameTiny<std::endian::native> );
5858 // Allocate a new page if we do not fit in the current one
5959 if (outputs.empty () || outputs.back ().len > WebSocketConstants::MaxChunkSize || (size + maskSize + headerSize) > (WebSocketConstants::MaxChunkSize - outputs.back ().len )) {
6060 char * chunk = (char *)malloc (WebSocketConstants::MaxChunkSize);
@@ -64,11 +64,11 @@ void encode_websocket_frames(std::vector<uv_buf_t>& outputs, char const* src, si
6464 // Reposition the buffer to the end of the current page
6565 buffer = buf.base + buf.len ;
6666 buf.len += headerSize + size + maskSize;
67- WebSocketFrameTiny * header = (WebSocketFrameTiny*)buffer;
67+ auto * header = (WebSocketFrameTiny<std::endian::native> *)buffer;
6868 memset (buffer, 0 , headerSize);
6969 header->len = size;
7070 } else if (size < 1 << 16 ) {
71- headerSize = sizeof (WebSocketFrameShort);
71+ headerSize = sizeof (WebSocketFrameShort<std::endian::native> );
7272 // Allocate a new page if we do not fit in the current one
7373 if (outputs.empty () || outputs.back ().len > WebSocketConstants::MaxChunkSize || (size + maskSize + headerSize) > (WebSocketConstants::MaxChunkSize - outputs.back ().len )) {
7474 char * chunk = (char *)malloc (WebSocketConstants::MaxChunkSize);
@@ -78,24 +78,24 @@ void encode_websocket_frames(std::vector<uv_buf_t>& outputs, char const* src, si
7878 // Reposition the buffer to the end of the current page
7979 buffer = buf.base + buf.len ;
8080 buf.len += headerSize + size + maskSize;
81- WebSocketFrameShort * header = (WebSocketFrameShort*)buffer;
81+ auto * header = (WebSocketFrameShort<std::endian::native> *)buffer;
8282 memset (buffer, 0 , headerSize);
8383 header->len = 126 ;
8484 header->len16 = htons (size);
8585 } else {
8686 // For larger messages we do standalone allocation
8787 // so that the message does not need to be sent in multiple chunks
88- headerSize = sizeof (WebSocketFrameHuge);
88+ headerSize = sizeof (WebSocketFrameHuge<std::endian::native> );
8989 buffer = (char *)malloc (headerSize + maskSize + size);
90- WebSocketFrameHuge * header = (WebSocketFrameHuge*)buffer;
90+ auto * header = (WebSocketFrameHuge<std::endian::native> *)buffer;
9191 memset (buffer, 0 , headerSize);
9292 header->len = 127 ;
93- header->len64 = htonll ( size);
93+ header->len64 = (std::endian::native == std::endian::little) ? __builtin_bswap64 ( size) : size ;
9494 outputs.push_back (uv_buf_init (buffer, size + maskSize + headerSize));
9595 }
9696 size_t fullHeaderSize = maskSize + headerSize;
9797 startPayload = buffer + fullHeaderSize;
98- WebSocketFrameTiny * header = (WebSocketFrameTiny*)buffer;
98+ auto * header = (WebSocketFrameTiny<std::endian::native> *)buffer;
9999 header->fin = 1 ;
100100 header->opcode = (unsigned char )opcode; // binary or text for now
101101 // Mask is right before payload.
@@ -143,7 +143,7 @@ void decode_websocket(char* start, size_t size, WebSocketHandler& handler)
143143 handler.beginChunk ();
144144 // The + 2 is there because we need at least 2 bytes.
145145 while (cur - start < size) {
146- WebSocketFrameTiny * header = (WebSocketFrameTiny*)cur;
146+ auto * header = (WebSocketFrameTiny<std::endian::native> *)cur;
147147 size_t payloadSize = 0 ;
148148 size_t headerSize = 0 ;
149149 if ((cur + 2 - start >= size) ||
@@ -160,12 +160,12 @@ void decode_websocket(char* start, size_t size, WebSocketHandler& handler)
160160 payloadSize = header->len ;
161161 headerSize = 2 + (header->mask ? 4 : 0 );
162162 } else if (header->len == 126 ) {
163- WebSocketFrameShort * headerSmall = (WebSocketFrameShort*)cur;
163+ auto * headerSmall = (WebSocketFrameShort<std::endian::native> *)cur;
164164 payloadSize = ntohs (headerSmall->len16 );
165165 headerSize = 2 + 2 + (header->mask ? 4 : 0 );
166166 } else if (header->len == 127 ) {
167- WebSocketFrameHuge * headerSmall = (WebSocketFrameHuge*)cur;
168- payloadSize = ntohll ( headerSmall->len64 );
167+ auto * headerSmall = (WebSocketFrameHuge<std::endian::native> *)cur;
168+ payloadSize = (std::endian::native == std::endian::little) ? __builtin_bswap64 ( headerSmall->len64 ) : headerSmall-> len64 ;
169169 headerSize = 2 + 8 + (header->mask ? 4 : 0 );
170170 }
171171 size_t availableSize = size - (cur - start);
0 commit comments