MCPcopy Create free account
hub / github.com/JoaoLopesF/RemoteDebug / handleHeader

Method handleHeader

src/utility/WebSocketsServer.cpp:716–870  ·  view source on GitHub ↗

* handles http header reading for WebSocket upgrade * @param client WSclient_t * ///< pointer to the client struct * @param headerLine String ///< the header being read / processed */

Source from the content-addressed store, hash-verified

714 * @param headerLine String ///< the header being read / processed
715 */
716void 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 }

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected