Mam następujący kod, w którym requestLine
jest zawsze puste i nie mogę zrozumieć, dlaczego. request
zawiera nieprzetworzone żądanie HTTP i chcę uzyskać pierwszą linię żądania zawierającą metodę i adres URL.
boolean parseRequest(String* request) { int firstEOLAt = request->indexOf("\n"); if (firstEOLAt < 0) return false; Serial.println(firstEOLAt); String requestLine = request->substring(0, firstEOLAt); Serial.println(requestLine); // ...rest of the parsing will go here... return true; }
Pierwsza println
zwraca 26, tak jak można by oczekiwać dla ciągu "GET /ilyen_nincs HTTP/1.1"
(25 znaków), ale potem requestLine
jest zawsze puste. Zastanawiam się, dlaczego?
Odpowiedź
GET /ilyen_nincs HTTP/1.1\n
ma 26 znaków, więc indeksy łańcuchów mieszczą się w przedziale od 0 do 25. Ponieważ drugi argument w substring(0, firstEOLAt);
przekracza indeks końcowy ciągu, to nieoczekiwane zachowanie zgodnie z dokumentacją i pobranie pustego ciągu.
Uwaga: należy upewnij się, że wartości indeksu mieszczą się w długości ciągu, inaczej otrzymasz nieprzewidywalne wyniki. Ten rodzaj błędu może być szczególnie trudny do znalezienia w drugim wystąpieniu funkcji substring (), jeśli pozycja początkowa jest mniejsza niż długość ciągu, ale pozycja końcowa nie jest równa „t”.