The library with which to configure a Web Socket Server on a Mbed. This lib was coded by a day at least one year before when this description is written. It will be updated adopting mbed os 5.

Dependencies:   mbedTLSLibrary

Dependents:   SIMPLE_WSS

Committer:
aktk
Date:
Thu Dec 08 10:11:25 2016 +0000
Revision:
0:86a479dd1814
Child:
1:73f2f67d1732
Handshake is ok but rxdata has something wrong.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 0:86a479dd1814 1 #include "WS_SERVER.h"
aktk 0:86a479dd1814 2 #define DEBUG
aktk 0:86a479dd1814 3
aktk 0:86a479dd1814 4 //Serial wspc(USBTX, USBRX);
aktk 0:86a479dd1814 5 namespace WS_SERVER
aktk 0:86a479dd1814 6 {
aktk 0:86a479dd1814 7 void DEBUG_PRINT_LINE(const char* arg_line)
aktk 0:86a479dd1814 8 {
aktk 0:86a479dd1814 9 #ifdef DEBUG
aktk 0:86a479dd1814 10 printf("(WSS) ");
aktk 0:86a479dd1814 11 printf(arg_line);
aktk 0:86a479dd1814 12 printf("\r\n");
aktk 0:86a479dd1814 13 #endif
aktk 0:86a479dd1814 14 }
aktk 0:86a479dd1814 15 template<typename T>
aktk 0:86a479dd1814 16 void DEBUG_PRINT_LINE(const char* arg_line, T arg_t)
aktk 0:86a479dd1814 17 {
aktk 0:86a479dd1814 18 #ifdef DEBUG
aktk 0:86a479dd1814 19 printf("(WSS) ");
aktk 0:86a479dd1814 20 printf(arg_line, arg_t);
aktk 0:86a479dd1814 21 printf("\r\n");
aktk 0:86a479dd1814 22 #endif
aktk 0:86a479dd1814 23 }
aktk 0:86a479dd1814 24 template<typename T1, typename T2>
aktk 0:86a479dd1814 25 void DEBUG_PRINT_LINE(const char* arg_line, T1 arg_t1, T2 arg_t2)
aktk 0:86a479dd1814 26 {
aktk 0:86a479dd1814 27 #ifdef DEBUG
aktk 0:86a479dd1814 28 printf("(WSS) ");
aktk 0:86a479dd1814 29 printf(arg_line, arg_t1, arg_t2);
aktk 0:86a479dd1814 30 printf("\r\n");
aktk 0:86a479dd1814 31 #endif
aktk 0:86a479dd1814 32 }
aktk 0:86a479dd1814 33 }
aktk 0:86a479dd1814 34 using namespace WS_SERVER;
aktk 0:86a479dd1814 35
aktk 0:86a479dd1814 36 WSS::WSS()
aktk 0:86a479dd1814 37 :m_RxBufferSize(1024)
aktk 0:86a479dd1814 38 ,m_PortNumber(8085)
aktk 0:86a479dd1814 39 {
aktk 0:86a479dd1814 40 m_ListeningFlag = (false);
aktk 0:86a479dd1814 41 m_RxBuffer = new int8_t[1024];
aktk 0:86a479dd1814 42 m_restAppDataLen = 0;
aktk 0:86a479dd1814 43
aktk 0:86a479dd1814 44 m_DiscontiuanceFlag = false;
aktk 0:86a479dd1814 45 m_EODFlag = false;
aktk 0:86a479dd1814 46 }
aktk 0:86a479dd1814 47
aktk 0:86a479dd1814 48 WSS::WSS(uint32_t arg_RxBufferSize, uint32_t arg_PortNumber)
aktk 0:86a479dd1814 49 :m_RxBufferSize(arg_RxBufferSize)
aktk 0:86a479dd1814 50 ,m_PortNumber(arg_PortNumber)
aktk 0:86a479dd1814 51 {
aktk 0:86a479dd1814 52 m_ListeningFlag = (false);
aktk 0:86a479dd1814 53 m_RxBuffer = new int8_t[arg_RxBufferSize];
aktk 0:86a479dd1814 54 m_restAppDataLen = 0;
aktk 0:86a479dd1814 55
aktk 0:86a479dd1814 56 m_DiscontiuanceFlag = false;
aktk 0:86a479dd1814 57 m_EODFlag = false;
aktk 0:86a479dd1814 58 }
aktk 0:86a479dd1814 59
aktk 0:86a479dd1814 60 WSS::~WSS()
aktk 0:86a479dd1814 61 {
aktk 0:86a479dd1814 62 delete(m_RxBuffer);
aktk 0:86a479dd1814 63 }
aktk 0:86a479dd1814 64
aktk 0:86a479dd1814 65 bool WSS::init()
aktk 0:86a479dd1814 66 {
aktk 0:86a479dd1814 67 DEBUG_PRINT_LINE("DEBUG MODE");
aktk 0:86a479dd1814 68
aktk 0:86a479dd1814 69 // Ethernet Initialization
aktk 0:86a479dd1814 70 if(m_eth.init()) {
aktk 0:86a479dd1814 71 printf("(WSS) Error!@EthernetInterface::init()\r\n");
aktk 0:86a479dd1814 72 return false;
aktk 0:86a479dd1814 73 }
aktk 0:86a479dd1814 74 // Ethernet Connecting setup
aktk 0:86a479dd1814 75 if(m_eth.connect()) {
aktk 0:86a479dd1814 76 printf("(WSS) Error!@EthernetInterface::connect()\r\n");
aktk 0:86a479dd1814 77 return false;
aktk 0:86a479dd1814 78 } else {
aktk 0:86a479dd1814 79 printf("(WSS) IP Address is %s\r\n", m_eth.getIPAddress());
aktk 0:86a479dd1814 80 }
aktk 0:86a479dd1814 81
aktk 0:86a479dd1814 82
aktk 0:86a479dd1814 83 // TCP Socket setup
aktk 0:86a479dd1814 84 // To open Server-side PORT
aktk 0:86a479dd1814 85 if(m_tcpsvr.bind(m_PortNumber)< 0) {
aktk 0:86a479dd1814 86 printf("(WSS) Error!@TCPSocketServer::bind()\r\n");
aktk 0:86a479dd1814 87 return false;
aktk 0:86a479dd1814 88 } else {
aktk 0:86a479dd1814 89 printf("(WSS) TCP Server has bounden!\r\n");
aktk 0:86a479dd1814 90 }
aktk 0:86a479dd1814 91 // Server start listening Request from a web browser.
aktk 0:86a479dd1814 92 if(m_tcpsvr.listen(1) < 0) {
aktk 0:86a479dd1814 93 printf("(WSS) TCP server listen failed.\r\n");
aktk 0:86a479dd1814 94 return false;
aktk 0:86a479dd1814 95 } else {
aktk 0:86a479dd1814 96 m_ListeningFlag = true;
aktk 0:86a479dd1814 97 printf("(WSS) TCP server is listening...\r\n");
aktk 0:86a479dd1814 98 }
aktk 0:86a479dd1814 99
aktk 0:86a479dd1814 100 return true;
aktk 0:86a479dd1814 101 }
aktk 0:86a479dd1814 102
aktk 0:86a479dd1814 103 bool WSS::isListening()
aktk 0:86a479dd1814 104 {
aktk 0:86a479dd1814 105 return m_ListeningFlag;
aktk 0:86a479dd1814 106 }
aktk 0:86a479dd1814 107
aktk 0:86a479dd1814 108 void WSS::run()
aktk 0:86a479dd1814 109 {
aktk 0:86a479dd1814 110 DigitalOut led3(LED3);
aktk 0:86a479dd1814 111 DigitalOut led4(LED4);
aktk 0:86a479dd1814 112
aktk 0:86a479dd1814 113 while (m_ListeningFlag) {
aktk 0:86a479dd1814 114 led3 = true;
aktk 0:86a479dd1814 115 // blocking mode (never timeout)
aktk 0:86a479dd1814 116 // waiting client connection
aktk 0:86a479dd1814 117 printf("(WSS) Waiting Connection\r\n");
aktk 0:86a479dd1814 118 if(m_tcpsvr.accept(m_tcpcon) < 0) {
aktk 0:86a479dd1814 119 printf("(WSS) Failed to accept connection.\r\n");
aktk 0:86a479dd1814 120 } else {
aktk 0:86a479dd1814 121 printf("(WSS) Connection Success!\r\n");
aktk 0:86a479dd1814 122 printf("(WSS) IP: %s\r\n",m_tcpcon.get_address());
aktk 0:86a479dd1814 123
aktk 0:86a479dd1814 124 led4 = true;
aktk 0:86a479dd1814 125 }
aktk 0:86a479dd1814 126 // When conected
aktk 0:86a479dd1814 127 // Main WSS Communication----------------------------------
aktk 0:86a479dd1814 128 while(m_tcpcon.is_connected()) {
aktk 0:86a479dd1814 129 DEBUG_PRINT_LINE("(WSS) Connected");
aktk 0:86a479dd1814 130 handshake();
aktk 0:86a479dd1814 131 while(!m_DiscontiuanceFlag)rxMessage();
aktk 0:86a479dd1814 132 DEBUG_PRINT_LINE("(WSS) Closing");
aktk 0:86a479dd1814 133 // txClosing(1002, "RecievedNot Masked Data");
aktk 0:86a479dd1814 134 }
aktk 0:86a479dd1814 135 // ^^^^^^^^^^^^^^^^^^^^^^----------------------------------
aktk 0:86a479dd1814 136 printf("(WSS) Close connection.\r\ntcp server is listening...\r\n");
aktk 0:86a479dd1814 137 m_tcpcon.close();
aktk 0:86a479dd1814 138 led4 = false;
aktk 0:86a479dd1814 139
aktk 0:86a479dd1814 140 // When any critical errors are occured.
aktk 0:86a479dd1814 141 //if(/*anyerror*/) m_ListeningFlag = false;
aktk 0:86a479dd1814 142 }
aktk 0:86a479dd1814 143 m_tcpsvr.close();
aktk 0:86a479dd1814 144 led3 = false;
aktk 0:86a479dd1814 145 while(1);
aktk 0:86a479dd1814 146 }
aktk 0:86a479dd1814 147
aktk 0:86a479dd1814 148 bool WSS::isReadable()
aktk 0:86a479dd1814 149 {
aktk 0:86a479dd1814 150 if(m_restAppDataLen > 0)
aktk 0:86a479dd1814 151 return true;
aktk 0:86a479dd1814 152 else
aktk 0:86a479dd1814 153 return false;
aktk 0:86a479dd1814 154 }
aktk 0:86a479dd1814 155
aktk 0:86a479dd1814 156 int8_t WSS::getRxData()
aktk 0:86a479dd1814 157 {
aktk 0:86a479dd1814 158 if(m_restAppDataLen > 0) {
aktk 0:86a479dd1814 159 int l_index = m_ApplicationLen - m_restAppDataLen;
aktk 0:86a479dd1814 160 m_restAppDataLen--;
aktk 0:86a479dd1814 161 return m_PayloadData[l_index] ^ m_Masking_key[l_index % 4];
aktk 0:86a479dd1814 162 } else
aktk 0:86a479dd1814 163 return 0x00;
aktk 0:86a479dd1814 164 }
aktk 0:86a479dd1814 165
aktk 0:86a479dd1814 166 void WSS::discardRxBuffer()
aktk 0:86a479dd1814 167 {
aktk 0:86a479dd1814 168 m_RxBuffer = NULL;
aktk 0:86a479dd1814 169 m_restAppDataLen = 0;
aktk 0:86a479dd1814 170 }
aktk 0:86a479dd1814 171
aktk 0:86a479dd1814 172 void WSS::txPing()
aktk 0:86a479dd1814 173 {
aktk 0:86a479dd1814 174 DEBUG_PRINT_LINE("Ping Pong Debug");
aktk 0:86a479dd1814 175 }
aktk 0:86a479dd1814 176 int8_t WSS::rxMessage()
aktk 0:86a479dd1814 177 {
aktk 0:86a479dd1814 178 int64_t l_RxDataLen = 0;
aktk 0:86a479dd1814 179 int64_t l_MesuredDataLen = 0;
aktk 0:86a479dd1814 180
aktk 0:86a479dd1814 181 if(isReadable()) return -1;
aktk 0:86a479dd1814 182 //
aktk 0:86a479dd1814 183 // A (part of) data is recieved here.
aktk 0:86a479dd1814 184 //
aktk 0:86a479dd1814 185 m_DiscontiuanceFlag = false;
aktk 0:86a479dd1814 186 switch(l_RxDataLen = m_tcpcon.receive((char*)m_RxBuffer, m_RxBufferSize)) {
aktk 0:86a479dd1814 187 case 0:
aktk 0:86a479dd1814 188 DEBUG_PRINT_LINE("Recieved buffer is empty.");
aktk 0:86a479dd1814 189 m_DiscontiuanceFlag = true;
aktk 0:86a479dd1814 190 break;
aktk 0:86a479dd1814 191 case -1:
aktk 0:86a479dd1814 192 DEBUG_PRINT_LINE("Failed to read data from client.");
aktk 0:86a479dd1814 193 m_DiscontiuanceFlag = true;
aktk 0:86a479dd1814 194 break;
aktk 0:86a479dd1814 195 default:
aktk 0:86a479dd1814 196 DEBUG_PRINT_LINE("Massege Has Received");
aktk 0:86a479dd1814 197 break;
aktk 0:86a479dd1814 198 }
aktk 0:86a479dd1814 199 DEBUG_PRINT_LINE("Data size: %d Bytes", strlen((char*) m_RxBuffer));
aktk 0:86a479dd1814 200 for(int i = 0; i < strlen((char*) m_RxBuffer); i++)
aktk 0:86a479dd1814 201 DEBUG_PRINT_LINE("Data%5d: %x", i, m_RxBuffer[i]);
aktk 0:86a479dd1814 202 //
aktk 0:86a479dd1814 203 // Data Parsing
aktk 0:86a479dd1814 204 //
aktk 0:86a479dd1814 205 l_MesuredDataLen++;
aktk 0:86a479dd1814 206 m_FIN_RSV = m_RxBuffer[0] >> 4;
aktk 0:86a479dd1814 207 DEBUG_PRINT_LINE("FIN RSV: %x", m_FIN_RSV);
aktk 0:86a479dd1814 208 //If FIN is 1, the data is the last of a sequence.
aktk 0:86a479dd1814 209 if(m_FIN_RSV >> 3)
aktk 0:86a479dd1814 210 m_EODFlag = true;
aktk 0:86a479dd1814 211 //IF RSV1, 2, or 3 is 1, communication should be discontinued, because there is no negotiation.
aktk 0:86a479dd1814 212 if(m_FIN_RSV & 0x07)
aktk 0:86a479dd1814 213 m_DiscontiuanceFlag = true;
aktk 0:86a479dd1814 214 m_Opcode = m_RxBuffer[0] & 0x0F;
aktk 0:86a479dd1814 215 switch((OpCode)m_Opcode) {
aktk 0:86a479dd1814 216 case cont:
aktk 0:86a479dd1814 217 case txt:
aktk 0:86a479dd1814 218 case bin:
aktk 0:86a479dd1814 219 case close:
aktk 0:86a479dd1814 220 case ping:
aktk 0:86a479dd1814 221 case pong: {
aktk 0:86a479dd1814 222 m_FrameOpcode = (OpCode)m_Opcode;
aktk 0:86a479dd1814 223 break;
aktk 0:86a479dd1814 224 }
aktk 0:86a479dd1814 225 default: {
aktk 0:86a479dd1814 226 m_DiscontiuanceFlag = true;
aktk 0:86a479dd1814 227 break;
aktk 0:86a479dd1814 228 }
aktk 0:86a479dd1814 229 }
aktk 0:86a479dd1814 230 DEBUG_PRINT_LINE("Data parsing ... 1/3");
aktk 0:86a479dd1814 231 DEBUG_PRINT_LINE("FIN RSV: %x", m_FIN_RSV);
aktk 0:86a479dd1814 232 DEBUG_PRINT_LINE("Opcode : %x", m_Opcode);
aktk 0:86a479dd1814 233 l_MesuredDataLen++;
aktk 0:86a479dd1814 234 // サーバは、マスクされていないフレームを受信した際には,接続を close しなければならない。
aktk 0:86a479dd1814 235 // この場合,サーバは、 7.4.1 節 の定義に従って,ステータスコード 1002 (プロトコル­エラー)を伴う Close フレームを送信してもよい。
aktk 0:86a479dd1814 236 m_Mask = m_RxBuffer[1] >> 7;
aktk 0:86a479dd1814 237 if(m_Mask == 0) {
aktk 0:86a479dd1814 238 m_DiscontiuanceFlag = true;
aktk 0:86a479dd1814 239 }
aktk 0:86a479dd1814 240 m_PayloadLen = m_RxBuffer[1] & (uint64_t)0x7f;
aktk 0:86a479dd1814 241 if(m_PayloadLen < 0x07e) {
aktk 0:86a479dd1814 242 l_MesuredDataLen += m_PayloadLen;
aktk 0:86a479dd1814 243 // Buffer [2] [3] [4] [5] have Masking_Key
aktk 0:86a479dd1814 244 l_MesuredDataLen += 4;
aktk 0:86a479dd1814 245 if(m_Mask) for(int i = 0; i < 4; i++) m_Masking_key[i] = (m_RxBuffer[2 + i]);
aktk 0:86a479dd1814 246 // The Head of Payload data is at buffer[6]
aktk 0:86a479dd1814 247 m_PayloadData = m_RxBuffer + 6;
aktk 0:86a479dd1814 248 } else if (m_PayloadLen == 0x07e) {
aktk 0:86a479dd1814 249 l_MesuredDataLen += m_PayloadLen;
aktk 0:86a479dd1814 250 // Two succeeded bytes buffer [2] and [3] have SubPayload
aktk 0:86a479dd1814 251 l_MesuredDataLen += 2;
aktk 0:86a479dd1814 252 m_PayloadLen = (uint64_t)((m_RxBuffer[2] << 8)|(m_RxBuffer[3]&0xff));
aktk 0:86a479dd1814 253 // Buffer [4] [5] [6] [7] have Masking_Key
aktk 0:86a479dd1814 254 l_MesuredDataLen += 4;
aktk 0:86a479dd1814 255 if(m_Mask) for(int i = 0; i < 4; i++) m_Masking_key[i] = (m_RxBuffer[4 + i]);
aktk 0:86a479dd1814 256 // The Head of Payload data is at buffer[8]
aktk 0:86a479dd1814 257 m_PayloadData = m_RxBuffer + 8;
aktk 0:86a479dd1814 258 } else if (m_PayloadLen == 0x07f) {
aktk 0:86a479dd1814 259 l_MesuredDataLen += m_PayloadLen;
aktk 0:86a479dd1814 260 // Eight succeeded bytes buffer [2], [3], [4], [5], [6], [7], [8], and [9] have SubPayload
aktk 0:86a479dd1814 261 l_MesuredDataLen += 8;
aktk 0:86a479dd1814 262 m_PayloadLen = (uint64_t)(m_RxBuffer[2] & 0xff);
aktk 0:86a479dd1814 263 for(int i = 0; i < 7; i++)
aktk 0:86a479dd1814 264 m_PayloadLen = (uint64_t)((m_PayloadLen << 8) | (m_RxBuffer[3 + i] & 0xff));
aktk 0:86a479dd1814 265 l_MesuredDataLen += 4;
aktk 0:86a479dd1814 266 // Buffer [10] [11] [12] [13] have Masking_Key
aktk 0:86a479dd1814 267 if(m_Mask) for(int i = 0; i < 4; i++) m_Masking_key[i] = (m_RxBuffer[10 + i]);
aktk 0:86a479dd1814 268 // The Head of Payload data is at buffer[14]
aktk 0:86a479dd1814 269 m_PayloadData = m_RxBuffer + 14;
aktk 0:86a479dd1814 270 }
aktk 0:86a479dd1814 271 DEBUG_PRINT_LINE("Data parsing ... 2/3");
aktk 0:86a479dd1814 272 DEBUG_PRINT_LINE("Mask : %x", m_Opcode);
aktk 0:86a479dd1814 273 DEBUG_PRINT_LINE("PL Len : %x", m_PayloadLen);
aktk 0:86a479dd1814 274
aktk 0:86a479dd1814 275 // Because there is no negotiation of Extention, Extention data is regarded as none.
aktk 0:86a479dd1814 276 m_ExtensionLen = 0;
aktk 0:86a479dd1814 277 m_ApplicationLen = m_PayloadLen - m_ExtensionLen;
aktk 0:86a479dd1814 278 m_restAppDataLen = m_ApplicationLen;
aktk 0:86a479dd1814 279 DEBUG_PRINT_LINE("Data parsing ... 3/3");
aktk 0:86a479dd1814 280 DEBUG_PRINT_LINE("Application Data Len: %d byte");
aktk 0:86a479dd1814 281
aktk 0:86a479dd1814 282 if(l_MesuredDataLen != l_RxDataLen) {
aktk 0:86a479dd1814 283 m_DiscontiuanceFlag = true;
aktk 0:86a479dd1814 284 }
aktk 0:86a479dd1814 285
aktk 0:86a479dd1814 286 return m_DiscontiuanceFlag ? 1 : 0;
aktk 0:86a479dd1814 287 }
aktk 0:86a479dd1814 288
aktk 0:86a479dd1814 289 bool WSS::handshake()
aktk 0:86a479dd1814 290 {
aktk 0:86a479dd1814 291 char* httpmethod = NULL;
aktk 0:86a479dd1814 292 char* filepath = NULL;
aktk 0:86a479dd1814 293 char* http_ver = NULL;
aktk 0:86a479dd1814 294 char* header_field_name = NULL;
aktk 0:86a479dd1814 295 char* header_field_val = NULL;
aktk 0:86a479dd1814 296
aktk 0:86a479dd1814 297 //
aktk 0:86a479dd1814 298 // Handshake HTTP Request Analysis
aktk 0:86a479dd1814 299 //
aktk 0:86a479dd1814 300 switch(m_tcpcon.receive((char*)m_RxBuffer, 1023)) {
aktk 0:86a479dd1814 301 case 0:
aktk 0:86a479dd1814 302 DEBUG_PRINT_LINE("Recieved buffer is empty.");
aktk 0:86a479dd1814 303 m_msger.setStatusLine(400, "No Request");
aktk 0:86a479dd1814 304 httpmethod = NULL;
aktk 0:86a479dd1814 305 filepath = NULL;
aktk 0:86a479dd1814 306 http_ver = NULL;
aktk 0:86a479dd1814 307 break;
aktk 0:86a479dd1814 308 case -1:
aktk 0:86a479dd1814 309 DEBUG_PRINT_LINE("Failed to read data from client.");
aktk 0:86a479dd1814 310 m_msger.setStatusLine(500, "Internal Server Error");
aktk 0:86a479dd1814 311 httpmethod = NULL;
aktk 0:86a479dd1814 312 filepath = NULL;
aktk 0:86a479dd1814 313 http_ver = NULL;
aktk 0:86a479dd1814 314 break;
aktk 0:86a479dd1814 315 default:
aktk 0:86a479dd1814 316 DEBUG_PRINT_LINE("Recieved Data: %d\r\n-->",strlen((char*)m_RxBuffer));
aktk 0:86a479dd1814 317 DEBUG_PRINT_LINE("%.*s[End of Request]", strlen((char*)m_RxBuffer),(char*)m_RxBuffer);
aktk 0:86a479dd1814 318 // get HTTP method, File path, HTTP version
aktk 0:86a479dd1814 319 httpmethod = strtok((char*)m_RxBuffer," ");
aktk 0:86a479dd1814 320 filepath = strtok(NULL, " ");
aktk 0:86a479dd1814 321 http_ver = strtok(NULL, "\r\n");
aktk 0:86a479dd1814 322 DEBUG_PRINT_LINE("httpmethod: %s", httpmethod);
aktk 0:86a479dd1814 323 DEBUG_PRINT_LINE("file path: %s", filepath);
aktk 0:86a479dd1814 324 DEBUG_PRINT_LINE("http ver : %s", http_ver);
aktk 0:86a479dd1814 325 break;
aktk 0:86a479dd1814 326 }
aktk 0:86a479dd1814 327
aktk 0:86a479dd1814 328 //
aktk 0:86a479dd1814 329 // Handshake Response Form
aktk 0:86a479dd1814 330 //
aktk 0:86a479dd1814 331 if (strcmp(httpmethod,"GET") == 0 ) {
aktk 0:86a479dd1814 332 DEBUG_PRINT_LINE("GET request incomming.");
aktk 0:86a479dd1814 333 // Define behaviour of server according to Request Header lines
aktk 0:86a479dd1814 334 // Apply request header field to response header field
aktk 0:86a479dd1814 335 char* field_Connection = NULL;
aktk 0:86a479dd1814 336 char* field_Upgrade = NULL;
aktk 0:86a479dd1814 337 char* field_Sec_WebSocket_Key = NULL;
aktk 0:86a479dd1814 338 char* field_Sec_WebSocket_Version = NULL;
aktk 0:86a479dd1814 339 char* field_Origin = NULL;
aktk 0:86a479dd1814 340 do {
aktk 0:86a479dd1814 341 //Analyze the header feilds
aktk 0:86a479dd1814 342 header_field_name = strtok(NULL, ":");
aktk 0:86a479dd1814 343 header_field_name++;
aktk 0:86a479dd1814 344 header_field_val = strtok(NULL, "\r\n");
aktk 0:86a479dd1814 345 header_field_val++;
aktk 0:86a479dd1814 346
aktk 0:86a479dd1814 347 if(header_field_name - 1 != NULL) {
aktk 0:86a479dd1814 348 if(!strcmp(header_field_name, "Connection")) {
aktk 0:86a479dd1814 349 field_Connection = header_field_val;
aktk 0:86a479dd1814 350 } else if(!strcmp(header_field_name, "Upgrade")) {
aktk 0:86a479dd1814 351 field_Upgrade = header_field_val;
aktk 0:86a479dd1814 352 } else if(!strcmp(header_field_name, "Sec-WebSocket-Key") ) {
aktk 0:86a479dd1814 353 field_Sec_WebSocket_Key = header_field_val;
aktk 0:86a479dd1814 354 } else if(!strcmp(header_field_name, "Sec-WebSocket-Version") ) {
aktk 0:86a479dd1814 355 field_Sec_WebSocket_Version = header_field_val;
aktk 0:86a479dd1814 356 } else if(!strcmp(header_field_name, "Origin") ) {
aktk 0:86a479dd1814 357 field_Origin = header_field_val;
aktk 0:86a479dd1814 358 }
aktk 0:86a479dd1814 359 DEBUG_PRINT_LINE("*header_field_name adr: %d %s", header_field_name - 1, header_field_name);
aktk 0:86a479dd1814 360 DEBUG_PRINT_LINE(" header_field_val adr: %d %s", header_field_val - 1, header_field_val);
aktk 0:86a479dd1814 361 } else {
aktk 0:86a479dd1814 362 break;
aktk 0:86a479dd1814 363 }
aktk 0:86a479dd1814 364 } while(1);
aktk 0:86a479dd1814 365
aktk 0:86a479dd1814 366 DEBUG_PRINT_LINE("Parsing has been done");
aktk 0:86a479dd1814 367 // if the request is to switching to the WebSocket Server
aktk 0:86a479dd1814 368 if(!strcmp((char*)field_Connection, "Upgrade")) {
aktk 0:86a479dd1814 369 if( !strcmp(field_Upgrade, "websocket") &&
aktk 0:86a479dd1814 370 field_Sec_WebSocket_Key != NULL &&
aktk 0:86a479dd1814 371 !strcmp(field_Sec_WebSocket_Version, "13") &&
aktk 0:86a479dd1814 372 field_Origin != NULL) {
aktk 0:86a479dd1814 373 DEBUG_PRINT_LINE("Prepering for Update");
aktk 0:86a479dd1814 374 //
aktk 0:86a479dd1814 375 // Calcurate the key
aktk 0:86a479dd1814 376 //
aktk 0:86a479dd1814 377 // concat the input key and the str.
aktk 0:86a479dd1814 378 unsigned char SecWebSocketAccept[256];
aktk 0:86a479dd1814 379 sprintf((char*)SecWebSocketAccept, "%s%s", field_Sec_WebSocket_Key, "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
aktk 0:86a479dd1814 380 DEBUG_PRINT_LINE("Appended Key: %s", (char*)SecWebSocketAccept);
aktk 0:86a479dd1814 381 // evaluate SHA1
aktk 0:86a479dd1814 382 unsigned char sha1Output[20];
aktk 0:86a479dd1814 383 sha1(SecWebSocketAccept, strlen((char*)SecWebSocketAccept), sha1Output);
aktk 0:86a479dd1814 384 DEBUG_PRINT_LINE("SHA1 hashed Key:");
aktk 0:86a479dd1814 385 for(int i = 0; i < 20; i++) DEBUG_PRINT_LINE("%x", sha1Output[i]);
aktk 0:86a479dd1814 386 // encode the hash into base 64
aktk 0:86a479dd1814 387 {
aktk 0:86a479dd1814 388 size_t sizeofbuffer = strlen((char*)SecWebSocketAccept);
aktk 0:86a479dd1814 389 if(base64_encode(SecWebSocketAccept, &sizeofbuffer, sha1Output, 20) != 0)DEBUG_PRINT_LINE("something wrong@base64_encode");
aktk 0:86a479dd1814 390 DEBUG_PRINT_LINE((char*)SecWebSocketAccept);
aktk 0:86a479dd1814 391 }
aktk 0:86a479dd1814 392 // --- end of culculation of the key ---
aktk 0:86a479dd1814 393 //
aktk 0:86a479dd1814 394 // Format HTTP response of ACK
aktk 0:86a479dd1814 395 //
aktk 0:86a479dd1814 396 DEBUG_PRINT_LINE("Communication Protocol will be Upgraded to Websocket!");
aktk 0:86a479dd1814 397 m_msger.resetHeader();
aktk 0:86a479dd1814 398 m_msger.setStatusLine(101, "Switching Protocols");
aktk 0:86a479dd1814 399 if(m_msger.setHeaderField("Connection", "Upgrade")) DEBUG_PRINT_LINE("buffer over flow@ResposeMessenger");
aktk 0:86a479dd1814 400 if(m_msger.setHeaderField("Upgrade", "websocket")) DEBUG_PRINT_LINE("buffer over flow@ResposeMessenger");
aktk 0:86a479dd1814 401 if(m_msger.setHeaderField("Sec-WebSocket-Accept", (char*)SecWebSocketAccept)) DEBUG_PRINT_LINE("buffer over flow@ResposeMessenger");
aktk 0:86a479dd1814 402 if(m_msger.setHeaderField("Access-Control-Allow-Origin", m_tcpcon.get_address())) DEBUG_PRINT_LINE("buffer over flow@ResposeMessenger");
aktk 0:86a479dd1814 403 // --- end of formatting ---
aktk 0:86a479dd1814 404 } else {
aktk 0:86a479dd1814 405 //
aktk 0:86a479dd1814 406 // Format HTTP Response of NACK
aktk 0:86a479dd1814 407 //
aktk 0:86a479dd1814 408 DEBUG_PRINT_LINE("Communication Protocol won't be Upgraded.");
aktk 0:86a479dd1814 409 m_msger.setStatusLine(426, "Upgrade Required");
aktk 0:86a479dd1814 410 if(m_msger.setHeaderField("Connection", "Close"))DEBUG_PRINT_LINE("buffer over flow @ ResponseMessenger");
aktk 0:86a479dd1814 411 // --- end of formatting ---
aktk 0:86a479dd1814 412 }
aktk 0:86a479dd1814 413 }
aktk 0:86a479dd1814 414 // send valid response
aktk 0:86a479dd1814 415 m_msger.sendHTTPResponse(m_tcpcon);
aktk 0:86a479dd1814 416 m_msger.resetHeader();
aktk 0:86a479dd1814 417 DEBUG_PRINT_LINE("echo back done.");
aktk 0:86a479dd1814 418 }
aktk 0:86a479dd1814 419 if (httpmethod == NULL) {
aktk 0:86a479dd1814 420 // send error response
aktk 0:86a479dd1814 421 m_msger.sendHTTPResponse(m_tcpcon);
aktk 0:86a479dd1814 422 m_msger.resetHeader();
aktk 0:86a479dd1814 423 DEBUG_PRINT_LINE("echo back done.");
aktk 0:86a479dd1814 424 }
aktk 0:86a479dd1814 425 DEBUG_PRINT_LINE("Response to Request has done");
aktk 0:86a479dd1814 426 // ----Handshake Response End----
aktk 0:86a479dd1814 427
aktk 0:86a479dd1814 428 return true;
aktk 0:86a479dd1814 429 }