David Fletcher / Mbed 2 deprecated cc3100_Test_websock_Camera_CM3

Dependencies:   mbed

Committer:
dflet
Date:
Sun Sep 06 15:19:36 2015 +0000
Revision:
0:400d8e75a8d0
TI's websocket Camera demo, also uses Arducam mini 0v5642 camera.

Who changed what in which revision?

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