* handles http header reading for WebSocket upgrade * @param client WSclient_t * ///< pointer to the client struct * @param headerLine String ///< the header being read / processed */
| 714 | * @param headerLine String ///< the header being read / processed |
| 715 | */ |
| 716 | void WebSocketsServer::handleHeader(WSclient_t * client, String * headerLine) { |
| 717 | |
| 718 | static const char * NEW_LINE = "\r\n"; |
| 719 | |
| 720 | headerLine->trim(); // remove \r |
| 721 | |
| 722 | if(headerLine->length() > 0) { |
| 723 | DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] RX: %s\n", client->num, headerLine->c_str()); |
| 724 | |
| 725 | // websocket requests always start with GET see rfc6455 |
| 726 | if(headerLine->startsWith("GET ")) { |
| 727 | |
| 728 | // cut URL out |
| 729 | client->cUrl = headerLine->substring(4, headerLine->indexOf(' ', 4)); |
| 730 | |
| 731 | //reset non-websocket http header validation state for this client |
| 732 | client->cHttpHeadersValid = true; |
| 733 | client->cMandatoryHeadersCount = 0; |
| 734 | |
| 735 | } else if(headerLine->indexOf(':')) { |
| 736 | String headerName = headerLine->substring(0, headerLine->indexOf(':')); |
| 737 | String headerValue = headerLine->substring(headerLine->indexOf(':') + 1); |
| 738 | |
| 739 | // remove space in the beginning (RFC2616) |
| 740 | if(headerValue[0] == ' ') { |
| 741 | headerValue.remove(0, 1); |
| 742 | } |
| 743 | |
| 744 | if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Connection"))) { |
| 745 | headerValue.toLowerCase(); |
| 746 | if(headerValue.indexOf(WEBSOCKETS_STRING("upgrade")) >= 0) { |
| 747 | client->cIsUpgrade = true; |
| 748 | } |
| 749 | } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Upgrade"))) { |
| 750 | if(headerValue.equalsIgnoreCase(WEBSOCKETS_STRING("websocket"))) { |
| 751 | client->cIsWebsocket = true; |
| 752 | } |
| 753 | } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Version"))) { |
| 754 | client->cVersion = headerValue.toInt(); |
| 755 | } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Key"))) { |
| 756 | client->cKey = headerValue; |
| 757 | client->cKey.trim(); // see rfc6455 |
| 758 | } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Protocol"))) { |
| 759 | client->cProtocol = headerValue; |
| 760 | } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Extensions"))) { |
| 761 | client->cExtensions = headerValue; |
| 762 | } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Authorization"))) { |
| 763 | client->base64Authorization = headerValue; |
| 764 | } else { |
| 765 | client->cHttpHeadersValid &= execHttpHeaderValidation(headerName, headerValue); |
| 766 | if(_mandatoryHttpHeaderCount > 0 && hasMandatoryHeader(headerName)) { |
| 767 | client->cMandatoryHeadersCount++; |
| 768 | } |
| 769 | } |
| 770 | |
| 771 | } else { |
| 772 | DEBUG_WEBSOCKETS("[WS-Client][handleHeader] Header error (%s)\n", headerLine->c_str()); |
| 773 | } |
nothing calls this directly
no outgoing calls
no test coverage detected