Buongiorno a tutti
Avrei bisogno di splittare un HTTP header il quale è una sequenza di char che arrivano in modalità seriale.
Non si può caricare tutto su stringhe perchè sono troppe, fare l'indexOf() dei parametri non mi serve perchè essi variano, quindi gestire i char non è proprio così facile e sono molte le parti che devo prelevare
Sapendo che:
- ogni riga termina con un '\n'
- le righe possono arrivare in ordine differente
- ogni singolo parametro di linea è separato da una ','
- ogni argomento di linea è separato da un solo ':' iniziale ...
esempio di header da spilttare
TWS: Returning 401
TWS: New request: GET / HTTP/1.1
path: /
Host: 192.168.2.177:9900
Connection: keep-alive
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53
Accept-Language: it-it
Authorization: Digest username="admin", realm="Remote Control", nonce="GyhtDk", uri="/", algorithm=MD5, response="1301b531398b24e975d079b9a2158078", opaque="012345"
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: y5GGHNbSD1AcLhh67wVIj==
Sec-WebSocket-Version: 13
Cookie: browser_aperto=mio_cookie
il tutto arriva da un while read ()
"ch" è il char seriale
prendiamo come esempio questa linea dove "admin" è il nome dell'utente e response="....." è la codifica MD5 di tutta la baracca che useremo come passw a 128 bit
Authorization: Digest username="admin", realm="Remote Control", nonce="GyhtDk", uri="/", algorithm=MD5, response="1301b531398b24e975d079b9a2158078", opaque="012345"
if (ch == ':'){ pos_copy_buff = 0;
copy_buffer[pos_copy_buff] = ch;
if (pos_copy_buff + 1 <= sizeof(copy_buffer)) pos_copy_buff++; // controllo che non superi la capienza [160]
if (ch == ',' || ch == '\n') {
copy_buffer[pos_copy_buff-1] = NULL; // tolgo la ',' mettendo il terminatore indietro di 1
pos_copy_buff = 0;
//Serial.println(String(copy_buffer)); // debug
Fino qui problemi non ci sono, la riga ottenuta è
: Digest username="admin"
ora devo trovare il nome dell'utente che si è collegato o che ci ha provato "admin" che si trova tra le " "
Andando avanti mi perdo con i terminatori
if(String(copy_buffer).indexOf("username") != -1) {
//if(String(copy_buffer).indexOf("response") != -1) {
Serial.println(String(copy_buffer)); //debug
Serial.println(); //debug
byte i;
for (i = 0; i < sizeof(copy_buffer) - 1; i++) {
if (copy_buffer[i] == '=') {
pos_copy_buff = 0; // azzero la posizione
i=i+2; // mi metto sul primo char dopo '"' (in questo esempio 'a')
}
name_user[pos_copy_buff] = copy_buffer[i]; // copio tutti i char in sequenza su name_user
if (pos_copy_buff + 1 <= sizeof(name_user)) pos_copy_buff++; // controllo che non superi la capienza
if (copy_buffer[i] == NULL){ // se trovo il terminatore
name_user[pos_copy_buff-2] = NULL; // chiudo col terminatore name_user
pos_copy_buff = 0;
break; //esco dal For
}
//Serial.print(copy_buffer[i]); //debug
}
//Serial.println(); //debug
Serial.print("name_user "); //debug
Serial.println(String(name_user)); //debug
}
}
A volte name_user è giusto, a volte è mozzato, a volte si pianta tutto ![]()
dov'è che sbaglio?
c'è un metodo un po' meno macchinoso?
usare miochar[0]=NULL; equivale a usare miochar[0]='\0'; ?
grazie, ciao