Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
http/server/WebSockHandler.cpp@12:7d75ba5deed1, 2015-07-12 (annotated)
- Committer:
- dflet
- Date:
- Sun Jul 12 09:13:56 2015 +0000
- Revision:
- 12:7d75ba5deed1
- Parent:
- 8:529a12812c53
- Child:
- 18:3f1b52616d00
WIP commit 13 reworked 12c
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| dflet | 0:50cedd586816 | 1 | //***************************************************************************** |
| dflet | 0:50cedd586816 | 2 | // Copyright (C) 2014 Texas Instruments Incorporated |
| dflet | 0:50cedd586816 | 3 | // |
| dflet | 0:50cedd586816 | 4 | // All rights reserved. Property of Texas Instruments Incorporated. |
| dflet | 0:50cedd586816 | 5 | // Restricted rights to use, duplicate or disclose this code are |
| dflet | 0:50cedd586816 | 6 | // granted through contract. |
| dflet | 0:50cedd586816 | 7 | // The program may not be used without the written permission of |
| dflet | 0:50cedd586816 | 8 | // Texas Instruments Incorporated or against the terms and conditions |
| dflet | 0:50cedd586816 | 9 | // stipulated in the agreement under which this program has been supplied, |
| dflet | 0:50cedd586816 | 10 | // and under no circumstances can it be used with non-TI connectivity device. |
| dflet | 0:50cedd586816 | 11 | // |
| dflet | 0:50cedd586816 | 12 | //***************************************************************************** |
| dflet | 0:50cedd586816 | 13 | |
| dflet | 0:50cedd586816 | 14 | |
| dflet | 0:50cedd586816 | 15 | /** |
| dflet | 0:50cedd586816 | 16 | * @addtogroup WebSockHandler |
| dflet | 0:50cedd586816 | 17 | * |
| dflet | 0:50cedd586816 | 18 | * @{ |
| dflet | 0:50cedd586816 | 19 | */ |
| dflet | 0:50cedd586816 | 20 | |
| dflet | 0:50cedd586816 | 21 | //#include "HttpHeaders.h" |
| dflet | 0:50cedd586816 | 22 | #include "HttpCore.h" |
| dflet | 0:50cedd586816 | 23 | #include "HttpResponse.h" |
| dflet | 0:50cedd586816 | 24 | #include "HttpRequest.h" |
| dflet | 0:50cedd586816 | 25 | #include "HttpAuth.h" |
| dflet | 0:50cedd586816 | 26 | #include "HttpDebug.h" |
| dflet | 0:50cedd586816 | 27 | #include <string.h> |
| dflet | 0:50cedd586816 | 28 | #include <stdlib.h> |
| dflet | 0:50cedd586816 | 29 | #include "HttpConfig.h" |
| dflet | 0:50cedd586816 | 30 | #include "HttpString.h" |
| dflet | 0:50cedd586816 | 31 | #include "osi.h" |
| dflet | 0:50cedd586816 | 32 | #include "WebSockHandler.h" |
| dflet | 0:50cedd586816 | 33 | #include "httpserverapp.h" |
| dflet | 0:50cedd586816 | 34 | |
| dflet | 0:50cedd586816 | 35 | // Include CC3200 SimpleLink headers |
| dflet | 0:50cedd586816 | 36 | #include "cc3100_simplelink.h" |
| dflet | 0:50cedd586816 | 37 | |
| dflet | 0:50cedd586816 | 38 | |
| dflet | 0:50cedd586816 | 39 | char *GlobRecvBuf; |
| dflet | 0:50cedd586816 | 40 | int64_t GlobPayloadLen; |
| dflet | 0:50cedd586816 | 41 | int64_t GlobRecvLen; |
| dflet | 0:50cedd586816 | 42 | UINT8 RecvMore = 0; |
| dflet | 0:50cedd586816 | 43 | char MaskKey[4]; |
| dflet | 0:50cedd586816 | 44 | UINT8 Mask; |
| dflet | 0:50cedd586816 | 45 | UINT8 Ping = 0; |
| dflet | 0:50cedd586816 | 46 | UINT8 Close = 0; |
| dflet | 0:50cedd586816 | 47 | |
| dflet | 0:50cedd586816 | 48 | // WebSocket response status line strings |
| dflet | 0:50cedd586816 | 49 | char WS_STATUS_OK_STR[] = "ok"; |
| dflet | 0:50cedd586816 | 50 | char WS_STATUS_GOING_AWAY_STR[] = "server down"; |
| dflet | 0:50cedd586816 | 51 | char WS_STATUS_ERROR_PROTOCOL_STR[] = "protocol error"; |
| dflet | 0:50cedd586816 | 52 | char WS_STATUS_ERROR_DATATYPE_STR[] = "datatype not supported"; |
| dflet | 0:50cedd586816 | 53 | char WS_STATUS_ERROR_ENCODING_STR[] = "data not interpreted"; |
| dflet | 0:50cedd586816 | 54 | char WS_STATUS_ERROR_OVERFLOW_STR[] = "data too large"; |
| dflet | 0:50cedd586816 | 55 | char WS_STATUS_ERROR_UNEXPECTED_STR[] = "unexpected event server"; |
| dflet | 0:50cedd586816 | 56 | |
| dflet | 0:50cedd586816 | 57 | |
| dflet | 0:50cedd586816 | 58 | /* This function parses the incoming data packet |
| dflet | 0:50cedd586816 | 59 | * @return 1 if successful |
| dflet | 0:50cedd586816 | 60 | 0 if failure |
| dflet | 0:50cedd586816 | 61 | */ |
| dflet | 0:50cedd586816 | 62 | /* |
| dflet | 0:50cedd586816 | 63 | |
| dflet | 0:50cedd586816 | 64 | 0 1 2 3 |
| dflet | 0:50cedd586816 | 65 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
| dflet | 0:50cedd586816 | 66 | +-+-+-+-+-------+-+-------------+-------------------------------+ |
| dflet | 0:50cedd586816 | 67 | |F|R|R|R| opcode|M| Payload len | Extended payload length | |
| dflet | 0:50cedd586816 | 68 | |I|S|S|S| (4) |A| (7) | (16/64) | |
| dflet | 0:50cedd586816 | 69 | |N|V|V|V| |S| | (if payload len==126/127) | |
| dflet | 0:50cedd586816 | 70 | | |1|2|3| |K| | | |
| dflet | 0:50cedd586816 | 71 | +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + |
| dflet | 0:50cedd586816 | 72 | | Extended payload length continued, if payload len == 127 | |
| dflet | 0:50cedd586816 | 73 | + - - - - - - - - - - - - - - - +-------------------------------+ |
| dflet | 0:50cedd586816 | 74 | | |Masking-key, if MASK set to 1 | |
| dflet | 0:50cedd586816 | 75 | +-------------------------------+-------------------------------+ |
| dflet | 0:50cedd586816 | 76 | | Masking-key (continued) | Payload Data | |
| dflet | 0:50cedd586816 | 77 | +-------------------------------- - - - - - - - - - - - - - - - + |
| dflet | 0:50cedd586816 | 78 | : Payload Data continued ... : |
| dflet | 0:50cedd586816 | 79 | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |
| dflet | 0:50cedd586816 | 80 | | Payload Data continued ... | |
| dflet | 0:50cedd586816 | 81 | +---------------------------------------------------------------+ |
| dflet | 0:50cedd586816 | 82 | |
| dflet | 0:50cedd586816 | 83 | |
| dflet | 0:50cedd586816 | 84 | */ |
| dflet | 0:50cedd586816 | 85 | |
| dflet | 0:50cedd586816 | 86 | int Payloadlength(struct HttpBlob * pData, UINT8 iter) |
| dflet | 0:50cedd586816 | 87 | { |
| dflet | 0:50cedd586816 | 88 | int result = 0x0; |
| dflet | 0:50cedd586816 | 89 | |
| dflet | 0:50cedd586816 | 90 | while(iter != 0) |
| dflet | 0:50cedd586816 | 91 | { |
| dflet | 0:50cedd586816 | 92 | result = ((int) (*(pData->pData)) | result); |
| dflet | 0:50cedd586816 | 93 | if(iter != 1) |
| dflet | 0:50cedd586816 | 94 | result = result << 8; |
| dflet | 0:50cedd586816 | 95 | pData->pData += sizeof(UINT8); |
| dflet | 0:50cedd586816 | 96 | pData->uLength -= sizeof(UINT8); |
| dflet | 0:50cedd586816 | 97 | iter--; |
| dflet | 0:50cedd586816 | 98 | } |
| dflet | 0:50cedd586816 | 99 | |
| dflet | 0:50cedd586816 | 100 | return result; |
| dflet | 0:50cedd586816 | 101 | } |
| dflet | 0:50cedd586816 | 102 | |
| dflet | 0:50cedd586816 | 103 | |
| dflet | 0:50cedd586816 | 104 | int WSCore_DataRecv(UINT16 uConnection,struct HttpBlob * pData) |
| dflet | 0:50cedd586816 | 105 | { |
| dflet | 0:50cedd586816 | 106 | UINT8 NextBlock; |
| dflet | 0:50cedd586816 | 107 | int lengthLeft; |
| dflet | 0:50cedd586816 | 108 | UINT16 final,RSV,Opcode; |
| dflet | 0:50cedd586816 | 109 | int PayloadLength; |
| dflet | 0:50cedd586816 | 110 | UINT8 iter; |
| dflet | 0:50cedd586816 | 111 | char *PayloadData; |
| dflet | 0:50cedd586816 | 112 | int RecvLength = (int)pData->uLength; |
| dflet | 0:50cedd586816 | 113 | |
| dflet | 0:50cedd586816 | 114 | |
| dflet | 0:50cedd586816 | 115 | if(!RecvMore) |
| dflet | 0:50cedd586816 | 116 | { |
| dflet | 0:50cedd586816 | 117 | //Parse the first byte |
| dflet | 0:50cedd586816 | 118 | NextBlock= *(pData->pData); |
| dflet | 0:50cedd586816 | 119 | pData->pData += sizeof(UINT8); |
| dflet | 0:50cedd586816 | 120 | pData->uLength -= sizeof(UINT8); |
| dflet | 0:50cedd586816 | 121 | |
| dflet | 0:50cedd586816 | 122 | //Mask bits to get header fields |
| dflet | 0:50cedd586816 | 123 | final = (NextBlock&(0x80)); |
| dflet | 0:50cedd586816 | 124 | RSV = (NextBlock&(0x70)); |
| dflet | 0:50cedd586816 | 125 | Opcode = ((NextBlock&(0x0F))); |
| dflet | 0:50cedd586816 | 126 | |
| dflet | 0:50cedd586816 | 127 | //If Final bit is set, this is the last data byte from client - terminating condition |
| dflet | 0:50cedd586816 | 128 | if(final) |
| dflet | 0:50cedd586816 | 129 | HttpDebug("Final datablock received \n\r"); |
| dflet | 0:50cedd586816 | 130 | |
| dflet | 0:50cedd586816 | 131 | |
| dflet | 0:50cedd586816 | 132 | //Inform user about the opcode |
| dflet | 0:50cedd586816 | 133 | HttpDebug("Opcode is %d\n\r",Opcode); |
| dflet | 0:50cedd586816 | 134 | |
| dflet | 0:50cedd586816 | 135 | switch(Opcode) |
| dflet | 0:50cedd586816 | 136 | { |
| dflet | 0:50cedd586816 | 137 | case WS_TEXT: |
| dflet | 0:50cedd586816 | 138 | HttpDebug("Text data\n\r"); |
| dflet | 0:50cedd586816 | 139 | break; |
| dflet | 0:50cedd586816 | 140 | case WS_BINARY: |
| dflet | 0:50cedd586816 | 141 | HttpDebug("Binary data\n\r"); |
| dflet | 0:50cedd586816 | 142 | break; |
| dflet | 0:50cedd586816 | 143 | case WS_CLOSE: |
| dflet | 0:50cedd586816 | 144 | HttpDebug("Client has requested connection to be closed\n\r"); |
| dflet | 0:50cedd586816 | 145 | Close = 1; |
| dflet | 0:50cedd586816 | 146 | WSStatusString(WS_STATUS_OK,pData); |
| dflet | 0:50cedd586816 | 147 | WSCore_DataSend(uConnection,*pData,Opcode); |
| dflet | 0:50cedd586816 | 148 | return 1; |
| dflet | 0:50cedd586816 | 149 | case WS_CONTINUATION: |
| dflet | 0:50cedd586816 | 150 | break; |
| dflet | 0:50cedd586816 | 151 | case WS_PING: |
| dflet | 0:50cedd586816 | 152 | HttpDebug("Ping received\n\r"); |
| dflet | 0:50cedd586816 | 153 | Ping = 1; |
| dflet | 0:50cedd586816 | 154 | break; |
| dflet | 0:50cedd586816 | 155 | case WS_PONG: |
| dflet | 0:50cedd586816 | 156 | HttpDebug("Pong received\n\r"); |
| dflet | 0:50cedd586816 | 157 | break; |
| dflet | 0:50cedd586816 | 158 | default: |
| dflet | 0:50cedd586816 | 159 | HttpDebug("This is unsupported\n\r"); |
| dflet | 0:50cedd586816 | 160 | break; |
| dflet | 0:50cedd586816 | 161 | } |
| dflet | 0:50cedd586816 | 162 | |
| dflet | 0:50cedd586816 | 163 | |
| dflet | 0:50cedd586816 | 164 | ///If header supports extension, send back error |
| dflet | 0:50cedd586816 | 165 | ///Send error frame : TODO |
| dflet | 0:50cedd586816 | 166 | if(RSV) |
| dflet | 0:50cedd586816 | 167 | HttpDebug("Unsupported extension\n\r"); |
| dflet | 0:50cedd586816 | 168 | |
| dflet | 0:50cedd586816 | 169 | //Parse the second byte |
| dflet | 0:50cedd586816 | 170 | NextBlock= *(pData->pData); |
| dflet | 0:50cedd586816 | 171 | pData->pData += sizeof(UINT8); |
| dflet | 0:50cedd586816 | 172 | pData->uLength -= sizeof(UINT8); |
| dflet | 0:50cedd586816 | 173 | |
| dflet | 0:50cedd586816 | 174 | Mask = (UINT8)(NextBlock&(0x80)); |
| dflet | 0:50cedd586816 | 175 | PayloadLength = (NextBlock&(0x7F)); |
| dflet | 0:50cedd586816 | 176 | |
| dflet | 0:50cedd586816 | 177 | //Payload length cases |
| dflet | 0:50cedd586816 | 178 | // If the payload length is 0x7E, the next 2 bytes represent the length |
| dflet | 0:50cedd586816 | 179 | if(PayloadLength == 0x7E) |
| dflet | 0:50cedd586816 | 180 | { |
| dflet | 0:50cedd586816 | 181 | iter = 2; |
| dflet | 0:50cedd586816 | 182 | PayloadLength = Payloadlength(pData, iter); |
| dflet | 0:50cedd586816 | 183 | } |
| dflet | 0:50cedd586816 | 184 | |
| dflet | 0:50cedd586816 | 185 | // If the payload length is 0x7F, the next 8 bytes represent the length |
| dflet | 0:50cedd586816 | 186 | if(PayloadLength == 0x7F) |
| dflet | 0:50cedd586816 | 187 | { |
| dflet | 0:50cedd586816 | 188 | iter = 8; |
| dflet | 0:50cedd586816 | 189 | PayloadLength = Payloadlength(pData, iter); |
| dflet | 0:50cedd586816 | 190 | } |
| dflet | 0:50cedd586816 | 191 | |
| dflet | 0:50cedd586816 | 192 | PayloadData = (char *)malloc(PayloadLength); |
| dflet | 0:50cedd586816 | 193 | if(PayloadData == NULL) |
| dflet | 0:50cedd586816 | 194 | { |
| dflet | 0:50cedd586816 | 195 | return 0; |
| dflet | 0:50cedd586816 | 196 | } |
| dflet | 0:50cedd586816 | 197 | memset(PayloadData,'\0',PayloadLength); |
| dflet | 0:50cedd586816 | 198 | GlobRecvBuf = PayloadData; |
| dflet | 0:50cedd586816 | 199 | GlobPayloadLen = PayloadLength; |
| dflet | 0:50cedd586816 | 200 | |
| dflet | 0:50cedd586816 | 201 | // If mask bit is set, the 4 bytes after payload length represent the masking key |
| dflet | 0:50cedd586816 | 202 | if(Mask) |
| dflet | 0:50cedd586816 | 203 | { |
| dflet | 0:50cedd586816 | 204 | memcpy(MaskKey,pData->pData,4); |
| dflet | 0:50cedd586816 | 205 | pData->pData += sizeof(UINT32); |
| dflet | 0:50cedd586816 | 206 | pData->uLength -= sizeof(UINT32); |
| dflet | 0:50cedd586816 | 207 | } |
| dflet | 0:50cedd586816 | 208 | |
| dflet | 0:50cedd586816 | 209 | int RecvLength = (int)pData->uLength; |
| dflet | 0:50cedd586816 | 210 | |
| dflet | 0:50cedd586816 | 211 | //Now, extract payload data |
| dflet | 0:50cedd586816 | 212 | memcpy(GlobRecvBuf,(const char *)(pData->pData),RecvLength); |
| dflet | 0:50cedd586816 | 213 | |
| dflet | 0:50cedd586816 | 214 | // Go back and get more data. |
| dflet | 0:50cedd586816 | 215 | if(PayloadLength > RecvLength) |
| dflet | 0:50cedd586816 | 216 | { |
| dflet | 0:50cedd586816 | 217 | GlobRecvLen = RecvLength; // Websocket header has 8 bytes that were also received. |
| dflet | 0:50cedd586816 | 218 | RecvMore = 1; |
| dflet | 0:50cedd586816 | 219 | return 1; |
| dflet | 0:50cedd586816 | 220 | } |
| dflet | 0:50cedd586816 | 221 | } |
| dflet | 0:50cedd586816 | 222 | |
| dflet | 0:50cedd586816 | 223 | else |
| dflet | 0:50cedd586816 | 224 | { |
| dflet | 0:50cedd586816 | 225 | memcpy(GlobRecvBuf+GlobRecvLen,(const char *)(pData->pData),RecvLength); |
| dflet | 0:50cedd586816 | 226 | GlobRecvLen += RecvLength; |
| dflet | 0:50cedd586816 | 227 | |
| dflet | 0:50cedd586816 | 228 | if(GlobRecvLen < GlobPayloadLen) |
| dflet | 0:50cedd586816 | 229 | return 1; |
| dflet | 0:50cedd586816 | 230 | } |
| dflet | 0:50cedd586816 | 231 | |
| dflet | 0:50cedd586816 | 232 | RecvMore = 0; |
| dflet | 0:50cedd586816 | 233 | |
| dflet | 0:50cedd586816 | 234 | |
| dflet | 0:50cedd586816 | 235 | if(Mask) |
| dflet | 0:50cedd586816 | 236 | { |
| dflet | 0:50cedd586816 | 237 | //UINT8 MaskBlock; |
| dflet | 0:50cedd586816 | 238 | char *pData = GlobRecvBuf; |
| dflet | 0:50cedd586816 | 239 | lengthLeft = GlobPayloadLen; |
| dflet | 0:50cedd586816 | 240 | UINT8 MaskIndex = 0; |
| dflet | 0:50cedd586816 | 241 | while(MaskIndex < 4) |
| dflet | 0:50cedd586816 | 242 | { |
| dflet | 0:50cedd586816 | 243 | NextBlock = (UINT8)(*pData); |
| dflet | 0:50cedd586816 | 244 | NextBlock ^= MaskKey[MaskIndex]; |
| dflet | 0:50cedd586816 | 245 | MaskIndex++; |
| dflet | 0:50cedd586816 | 246 | *pData = NextBlock; |
| dflet | 0:50cedd586816 | 247 | pData += sizeof(UINT8); |
| dflet | 0:50cedd586816 | 248 | lengthLeft -= sizeof(UINT8); |
| dflet | 0:50cedd586816 | 249 | if(lengthLeft == 0) |
| dflet | 0:50cedd586816 | 250 | break; |
| dflet | 0:50cedd586816 | 251 | if(MaskIndex == 4) |
| dflet | 0:50cedd586816 | 252 | MaskIndex = 0; |
| dflet | 0:50cedd586816 | 253 | } |
| dflet | 0:50cedd586816 | 254 | |
| dflet | 0:50cedd586816 | 255 | } |
| dflet | 0:50cedd586816 | 256 | |
| dflet | 0:50cedd586816 | 257 | *(GlobRecvBuf+GlobPayloadLen) = '\0'; |
| dflet | 0:50cedd586816 | 258 | |
| dflet | 0:50cedd586816 | 259 | struct HttpBlob PayLoad; |
| dflet | 0:50cedd586816 | 260 | PayLoad.pData = (UINT8 *)GlobRecvBuf; |
| dflet | 0:50cedd586816 | 261 | PayLoad.uLength = (UINT16)GlobPayloadLen; |
| dflet | 0:50cedd586816 | 262 | |
| dflet | 0:50cedd586816 | 263 | if(Ping) |
| dflet | 0:50cedd586816 | 264 | { |
| dflet | 0:50cedd586816 | 265 | HttpDebug("You were Pinged\n\r"); |
| dflet | 0:50cedd586816 | 266 | //You must pong |
| dflet | 0:50cedd586816 | 267 | Opcode = 0x0A; |
| dflet | 0:50cedd586816 | 268 | WSCore_DataSend(uConnection,PayLoad,Opcode); |
| dflet | 0:50cedd586816 | 269 | } |
| dflet | 0:50cedd586816 | 270 | |
| dflet | 0:50cedd586816 | 271 | //free(pData->pData); |
| dflet | 0:50cedd586816 | 272 | |
| dflet | 0:50cedd586816 | 273 | //Send this data to main |
| dflet | 0:50cedd586816 | 274 | WebSocketRecvEventHandler(uConnection,GlobRecvBuf); |
| dflet | 0:50cedd586816 | 275 | |
| dflet | 0:50cedd586816 | 276 | |
| dflet | 0:50cedd586816 | 277 | return 1; |
| dflet | 0:50cedd586816 | 278 | |
| dflet | 0:50cedd586816 | 279 | } |
| dflet | 0:50cedd586816 | 280 | |
| dflet | 0:50cedd586816 | 281 | /*! |
| dflet | 0:50cedd586816 | 282 | * \brief Sends data to a websocket client |
| dflet | 0:50cedd586816 | 283 | * |
| dflet | 0:50cedd586816 | 284 | * \param[in] uConnection Connection number on HTTP server. |
| dflet | 0:50cedd586816 | 285 | * \param[in] PayLoad Structure holding the payload data and the size of the data |
| dflet | 0:50cedd586816 | 286 | * \param[in] Opcode User provides data type (text/binary/ping/pong/close). |
| dflet | 0:50cedd586816 | 287 | * |
| dflet | 0:50cedd586816 | 288 | * \return 1 - If packet was successfully received, parsed and sent to the user API |
| dflet | 0:50cedd586816 | 289 | * 0 - Error |
| dflet | 0:50cedd586816 | 290 | */ |
| dflet | 0:50cedd586816 | 291 | int WSCore_DataSend(UINT16 uConnection, struct HttpBlob PayLoad, UINT8 Opcode) |
| dflet | 0:50cedd586816 | 292 | { |
| dflet | 12:7d75ba5deed1 | 293 | Uart_Write((uint8_t*)"WSCore_DataSend\n\r"); |
| dflet | 0:50cedd586816 | 294 | UINT16 usTotalLength; |
| dflet | 0:50cedd586816 | 295 | UINT8 usNextBlock; |
| dflet | 0:50cedd586816 | 296 | UINT16 usPayloadLen; // The heap cannot support beyond 65kb |
| dflet | 0:50cedd586816 | 297 | char *pucPayLoadData = (char *)PayLoad.pData; |
| dflet | 0:50cedd586816 | 298 | |
| dflet | 0:50cedd586816 | 299 | usNextBlock = 0; |
| dflet | 6:37fb696395d7 | 300 | |
| dflet | 0:50cedd586816 | 301 | if(Opcode != 0x02) |
| dflet | 0:50cedd586816 | 302 | usTotalLength = strlen(pucPayLoadData); |
| dflet | 0:50cedd586816 | 303 | else |
| dflet | 0:50cedd586816 | 304 | usTotalLength = PayLoad.uLength; |
| dflet | 0:50cedd586816 | 305 | |
| dflet | 0:50cedd586816 | 306 | do{ |
| dflet | 0:50cedd586816 | 307 | |
| dflet | 0:50cedd586816 | 308 | ///Is this the final packet? |
| dflet | 0:50cedd586816 | 309 | if(usTotalLength < FRAGMENT_LENGTH) |
| dflet | 0:50cedd586816 | 310 | { |
| dflet | 0:50cedd586816 | 311 | //final = 0x1; |
| dflet | 0:50cedd586816 | 312 | usNextBlock |= 0x80; |
| dflet | 0:50cedd586816 | 313 | } |
| dflet | 0:50cedd586816 | 314 | ///Add opcode to the header |
| dflet | 0:50cedd586816 | 315 | usNextBlock |= Opcode; |
| dflet | 0:50cedd586816 | 316 | |
| dflet | 0:50cedd586816 | 317 | /// Add this byte to the sendpacket |
| dflet | 0:50cedd586816 | 318 | HttpResponse_AddCharToResponseHeaders(usNextBlock); |
| dflet | 0:50cedd586816 | 319 | |
| dflet | 0:50cedd586816 | 320 | ///Reset byte |
| dflet | 0:50cedd586816 | 321 | usNextBlock = 0x0; |
| dflet | 0:50cedd586816 | 322 | ///Mask bit is always set to 0 from server to client |
| dflet | 0:50cedd586816 | 323 | |
| dflet | 0:50cedd586816 | 324 | ///PayloadLen field |
| dflet | 0:50cedd586816 | 325 | if(usTotalLength <= 125) |
| dflet | 0:50cedd586816 | 326 | usPayloadLen = usTotalLength; |
| dflet | 0:50cedd586816 | 327 | else |
| dflet | 0:50cedd586816 | 328 | usPayloadLen = (126); |
| dflet | 0:50cedd586816 | 329 | |
| dflet | 0:50cedd586816 | 330 | usNextBlock |= (UINT8)usPayloadLen; |
| dflet | 0:50cedd586816 | 331 | |
| dflet | 0:50cedd586816 | 332 | /// Add this byte to the sendpacket |
| dflet | 0:50cedd586816 | 333 | HttpResponse_AddCharToResponseHeaders(usNextBlock); |
| dflet | 0:50cedd586816 | 334 | |
| dflet | 0:50cedd586816 | 335 | /// If payload length is more than 125 bytes, we need 16 bits to represent it. |
| dflet | 0:50cedd586816 | 336 | if(usPayloadLen == (126)) |
| dflet | 0:50cedd586816 | 337 | { |
| dflet | 0:50cedd586816 | 338 | |
| dflet | 0:50cedd586816 | 339 | if(usTotalLength < FRAGMENT_LENGTH) |
| dflet | 0:50cedd586816 | 340 | usPayloadLen = usTotalLength; |
| dflet | 0:50cedd586816 | 341 | else |
| dflet | 0:50cedd586816 | 342 | usPayloadLen = FRAGMENT_LENGTH; |
| dflet | 0:50cedd586816 | 343 | |
| dflet | 0:50cedd586816 | 344 | if(usPayloadLen >= FRAGMENT_LENGTH - 4) |
| dflet | 0:50cedd586816 | 345 | usPayloadLen = FRAGMENT_LENGTH - 4; |
| dflet | 0:50cedd586816 | 346 | |
| dflet | 0:50cedd586816 | 347 | usNextBlock = (char)(usPayloadLen>>8); |
| dflet | 0:50cedd586816 | 348 | HttpResponse_AddCharToResponseHeaders(usNextBlock); |
| dflet | 0:50cedd586816 | 349 | usNextBlock = (char)(usPayloadLen); |
| dflet | 0:50cedd586816 | 350 | HttpResponse_AddCharToResponseHeaders(usNextBlock); |
| dflet | 0:50cedd586816 | 351 | } |
| dflet | 0:50cedd586816 | 352 | |
| dflet | 0:50cedd586816 | 353 | HttpResponse_AddStringToResponseHeaders(pucPayLoadData,(usPayloadLen)); |
| dflet | 0:50cedd586816 | 354 | |
| dflet | 0:50cedd586816 | 355 | if(!WS_SendPacket(uConnection)) |
| dflet | 0:50cedd586816 | 356 | return 0; |
| dflet | 0:50cedd586816 | 357 | |
| dflet | 0:50cedd586816 | 358 | if(Opcode == WS_CLOSE) |
| dflet | 0:50cedd586816 | 359 | { |
| dflet | 0:50cedd586816 | 360 | sl_WebSocketCloseEvtHdlr(); |
| dflet | 0:50cedd586816 | 361 | wait(1); |
| dflet | 0:50cedd586816 | 362 | (HttpCore_CloseConnection(uConnection)); |
| dflet | 0:50cedd586816 | 363 | return 1; |
| dflet | 0:50cedd586816 | 364 | } |
| dflet | 0:50cedd586816 | 365 | |
| dflet | 0:50cedd586816 | 366 | usTotalLength -= (usPayloadLen); |
| dflet | 0:50cedd586816 | 367 | |
| dflet | 0:50cedd586816 | 368 | // Reset to continuation frame if packet is larger than max fragment size |
| dflet | 0:50cedd586816 | 369 | Opcode = WS_CONTINUATION; |
| dflet | 0:50cedd586816 | 370 | |
| dflet | 0:50cedd586816 | 371 | ///Reset byte |
| dflet | 0:50cedd586816 | 372 | usNextBlock = 0x0; |
| dflet | 0:50cedd586816 | 373 | |
| dflet | 0:50cedd586816 | 374 | //Update pointer |
| dflet | 0:50cedd586816 | 375 | pucPayLoadData += usPayloadLen; |
| dflet | 0:50cedd586816 | 376 | |
| dflet | 0:50cedd586816 | 377 | }while(usTotalLength > 0); |
| dflet | 0:50cedd586816 | 378 | |
| dflet | 0:50cedd586816 | 379 | return 1; |
| dflet | 0:50cedd586816 | 380 | } |
| dflet | 0:50cedd586816 | 381 | |
| dflet | 0:50cedd586816 | 382 | |
| dflet | 0:50cedd586816 | 383 | /** |
| dflet | 0:50cedd586816 | 384 | * Returns status string according to status code - CHANGE |
| dflet | 0:50cedd586816 | 385 | */ |
| dflet | 0:50cedd586816 | 386 | void WSStatusString(UINT32 WS_Status, struct HttpBlob* status) |
| dflet | 0:50cedd586816 | 387 | { |
| dflet | 0:50cedd586816 | 388 | HttpString_utoa(WS_Status, status); |
| dflet | 0:50cedd586816 | 389 | struct HttpBlob blob = {0, NULL}; |
| dflet | 0:50cedd586816 | 390 | switch (WS_Status) |
| dflet | 0:50cedd586816 | 391 | { |
| dflet | 0:50cedd586816 | 392 | case WS_STATUS_OK: |
| dflet | 0:50cedd586816 | 393 | HttpBlobSetConst(blob, WS_STATUS_OK_STR); |
| dflet | 0:50cedd586816 | 394 | break; |
| dflet | 0:50cedd586816 | 395 | case WS_STATUS_GOING_AWAY: |
| dflet | 0:50cedd586816 | 396 | HttpBlobSetConst(blob, WS_STATUS_GOING_AWAY_STR); |
| dflet | 0:50cedd586816 | 397 | break; |
| dflet | 0:50cedd586816 | 398 | case WS_STATUS_ERROR_DATATYPE: |
| dflet | 0:50cedd586816 | 399 | HttpBlobSetConst(blob, WS_STATUS_ERROR_DATATYPE_STR); |
| dflet | 0:50cedd586816 | 400 | break; |
| dflet | 0:50cedd586816 | 401 | case WS_STATUS_ERROR_ENCODING: |
| dflet | 0:50cedd586816 | 402 | HttpBlobSetConst(blob, WS_STATUS_ERROR_ENCODING_STR); |
| dflet | 0:50cedd586816 | 403 | break; |
| dflet | 0:50cedd586816 | 404 | case WS_STATUS_ERROR_OVERFLOW: |
| dflet | 0:50cedd586816 | 405 | HttpBlobSetConst(blob, WS_STATUS_ERROR_OVERFLOW_STR); |
| dflet | 0:50cedd586816 | 406 | break; |
| dflet | 0:50cedd586816 | 407 | case WS_STATUS_ERROR_PROTOCOL: |
| dflet | 0:50cedd586816 | 408 | HttpBlobSetConst(blob, WS_STATUS_ERROR_PROTOCOL_STR); |
| dflet | 0:50cedd586816 | 409 | break; |
| dflet | 0:50cedd586816 | 410 | case WS_STATUS_ERROR_UNEXPECTED: |
| dflet | 0:50cedd586816 | 411 | HttpBlobSetConst(blob, WS_STATUS_ERROR_UNEXPECTED_STR); |
| dflet | 0:50cedd586816 | 412 | break; |
| dflet | 0:50cedd586816 | 413 | default: |
| dflet | 0:50cedd586816 | 414 | HttpDebug("Unknown response status \n\r"); |
| dflet | 0:50cedd586816 | 415 | HttpAssert(0); |
| dflet | 0:50cedd586816 | 416 | break; |
| dflet | 0:50cedd586816 | 417 | } |
| dflet | 0:50cedd586816 | 418 | memcpy(status->pData + status->uLength, blob.pData, blob.uLength); |
| dflet | 0:50cedd586816 | 419 | return; |
| dflet | 0:50cedd586816 | 420 | } |
| dflet | 0:50cedd586816 | 421 | |
| dflet | 0:50cedd586816 | 422 | /// @} |
| dflet | 0:50cedd586816 | 423 |