1 /* 2 * Copyright (C) 2012 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #ifndef WebSocketFrame_h 32 #define WebSocketFrame_h 33 34 #include "wtf/text/WTFString.h" 35 36 namespace WebCore { 37 38 struct WebSocketFrame { 39 // RFC6455 opcodes. 40 enum OpCode { 41 OpCodeContinuation = 0x0, 42 OpCodeText = 0x1, 43 OpCodeBinary = 0x2, 44 OpCodeClose = 0x8, 45 OpCodePing = 0x9, 46 OpCodePong = 0xA, 47 OpCodeInvalid = 0x10 48 }; 49 50 enum ParseFrameResult { 51 FrameOK, 52 FrameIncomplete, 53 FrameError 54 }; 55 isNonControlOpCodeWebSocketFrame56 static bool isNonControlOpCode(OpCode opCode) { return opCode == OpCodeContinuation || opCode == OpCodeText || opCode == OpCodeBinary; } isControlOpCodeWebSocketFrame57 static bool isControlOpCode(OpCode opCode) { return opCode == OpCodeClose || opCode == OpCodePing || opCode == OpCodePong; } isReservedOpCodeWebSocketFrame58 static bool isReservedOpCode(OpCode opCode) { return !isNonControlOpCode(opCode) && !isControlOpCode(opCode); } 59 static bool needsExtendedLengthField(size_t payloadLength); 60 static ParseFrameResult parseFrame(char* data, size_t dataLength, WebSocketFrame&, const char*& frameEnd, String& errorString); // May modify part of data to unmask the frame. 61 62 // Flags for the constructor. 63 // This is not the bitmasks for frame composition / decomposition. 64 enum { 65 EmptyFlags = 0, 66 Final = 1, 67 Reserved1 = 2, 68 Compress = 2, 69 Reserved2 = 4, 70 Reserved3 = 8, 71 Masked = 16, 72 }; 73 typedef unsigned Flags; 74 WebSocketFrame(); 75 // The Flags parameter shall be a combination of above flags. 76 WebSocketFrame(OpCode, const char* payload, size_t payloadLength, Flags = EmptyFlags); 77 void makeFrameData(Vector<char>& frameData); 78 79 OpCode opCode; 80 bool final; 81 bool compress; 82 bool reserved2; 83 bool reserved3; 84 bool masked; 85 const char* payload; 86 size_t payloadLength; 87 }; 88 89 } // namespace WebCore 90 91 #endif // WebSocketFrame_h 92