strupwd und struname werden doch überhaupt nicht aus dem gelesenen String readString extrahiert, aber anschließend verglichen und dann davon abhängig gemacht, ob authorized = true;
Das haut irgendwie hinten und vorne noch nicht hin.
strupwd und struname werden doch überhaupt nicht aus dem gelesenen String readString extrahiert, aber anschließend verglichen und dann davon abhängig gemacht, ob authorized = true;
Das haut irgendwie hinten und vorne noch nicht hin.
dieser Teil mit der Extrahierung von strupwd und struname ist hier nur verkürzt wiedergegeben, um die Lesbarkeit zu erhöhen, meine eigene Methode ist recht kompliziert.
Wie würdest DU diese Extrahierung samt Vergleich machen, und, wo wir gerade dabei sind, ggf. mit POST anstelle von GET?
Vieleicht liegt ja tatsächlich hier der Hase im Pfeffer...?
ich habs nochmals geändert und ein Schnipsel eingefügt:
Code:bool authorized=false; void handleNotAuthorized() { String readString = ""; char strinput[MAXLEN], strupwd[TOKLEN], struname[TOKLEN] ; WiFiClient client = wifiserver.available(); if (client) { //--------------------------------------- // debug // authorized=true; strcpy(strinput, ""); strcpy(strupwd, ""); strcpy(struname, ""); while ( client.connected() ) { if (authorized) return; if ( client.available() ) { char c = client.read(); //read char by request readString = ""; while ( (readString.length() < TOKLEN) && (c != '\n') ) { readString += c; c = client.read(); } readString.toCharArray(strinput, MAXLEN); if(strstr(website_upwd,strupwd)!=NULL & strstr(website_uname,struname)!=NULL) { authorized = true; readString = ""; return; // return; // <<< selbes Ergebnis, egal ob kommentiert oder auskommentiert } //if HTTP request has ended while ( c != '\n') { c = client.read(); } if (c == '\n') { //client.flush(); //now output html data header String script = ""; script += ("HTTP/1.1 200 OK\r\n"); script += ("Content-Type: text/html\r\n"); script += ("Connection: close\r\n"); script += ("\n"); // do not forget this one //???? script += ("<!DOCTYPE html> \n"); script += ("<html> \n"); script += ("<head> \n"); // utf-8 für "°" Zeichen script += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ; script += "<title>" ; script += "</title> \n" ; script += "</head> \n" ; script += "<body> \n" ; script += ("<h2><p style=\"color:rgb(255,0,191);\"> log in to proceed: </p> </h2> \n"); script += ("<FORM ACTION='/' method=GET > \n"); script += ("<h2>user name: <INPUT TYPE=text NAME='uname' VALUE='' MAXLENGTH='50'> </h2> \n"); script += ("<h2>password : <INPUT TYPE=PASSWORD NAME='upwd' VALUE='' MAXLENGTH='50'> </h2> \n"); script += ("<h2><INPUT TYPE=SUBMIT></h2> \n"); script += ("</FORM> \n"); script += ("<BR> \n"); script += ("</body> \n"); script += ("</html> \n"); client.println(script); delay(100); //stopping client client.stop(); //clearing string for next read //readString = ""; } } //delay(1); } } }
entscheidend ist, dass die Seite jedesmal angezeigt wird, wenn der Browser eine Anfrage an den Server stellt. Denn erst dann kann man das Passwort eingeben und den Namen, was dann ausgewertet werden muss.
Ob das Passwort stimmt oder ob der Vergleich dazu hinhaut wissen wir nicht, weil der Teil fehlt. Man kann das umschreiben, ich habe aber nicht die Möglichkeit, das mit 2.5.x zu probieren - glaub ich.
Muss mal sehen. Das kann so schwer nicht sein.
in dieser Form springt es wieder sofort aus der Website raus, wie ganz am Anfang.
- - - Aktualisiert - - -
mit
baut er wieder auf, bleibt aber auch wieder komplett im Formular hängen (wie zuvor)Code:while(client.connected()) { delay(10); } client.stop();
wie lese ich diese version beim nodemcu aus?
habe 2.2.0, update wird geladen
jetzt 2.5.2
beim nächsten Programmupload auf das Board dann hoffentlich 2.5.2
Ich bin mir zwar nicht sicher was du genau bezwecken willst, aber ich würde erstmal versuchen zu verstehen was ich für ein Verhalten erwarte, mich darüber schlau machen wie Browser sich in der gegebenen Situation verhalten und wie ich meinen Code bauen muss damit es auch mit jedem Browser überall funktioniert.
Webseiten darstellen ist kein Problem, man akzeptiert einen Client, ließt die Anfrage per client.read() aus, sucht die passende Webseite für die aufgerufene Adresse und gibt den HTML code zurück, flush, stop und fertig ist der Lack, das sollte auch einfach so ohne irgendwelche Probleme funktionieren.
Webaufrufe mit Daten vom Browser zum Server geht per GET oder POST, wobei man die GET Daten auch sofort übermitteln kann, sofern man weis was man eingeben muss.
Per POST braucht es erst ein Formular, welches man vorher auch zum Client senden muss, dafür braucht es also 2 Anfragen, die erste Anfrage welche die Webseite mit dem Formular an den client sendet und die 2te Anfrage als Action mit POST und dem ausgefüllten Formular.
Was du also schreiben musst ist eine Schleife, welche (sofern die Verbindung zum Browser offen hält mit wie Moppi schon beschrieben hatte, was allerdings auch nicht garantiert ist) immer client.read() benutzt um Anfragen zu empfangen, auszuwerten und zu verarbeiten und zu beantworten.
Zu jeder Anfrage muss es auch eine Webseite als Antwort geben, sonst beschwert sich dein Browser wie in deinem Fall dass der Server die Verbindung geschlossen hat!
Was du brauchst ist ein strukturierterer Ansatz für deine Aufgabe. Außerdem solltest du dich mit einfachen Session-Cookies beschäftigen, sonst bekomst du spätestens dann Probleme wenn du längere Zeit auf der Webseite bist, weil dein Browser irgendwann den Socket von sich aus schließt und du einen neuen "client" bekommst den du dann wieder neu authentifizieren musst. (oder du speicherst dir die IP des client als trick, aber das ist bei leibe nicht sicher und nur als workaround gemeint!!!!!!!)
--------------
Am besten schreibst du erstmal einen dummen Server, welcher Browseranfragen annimmt und an den Browser zurück spiegelt um erstmale in Gefühl für die Anfragen zu bekommen.
Wenn das klappt, braust du dir eine einfache Webseite zusammen, welche bei der richtigen Adresse auch ausgegeben wird.
Dann baust du in einer der Seiten einen Knopf für eine GET und einen Knopf + Formular für eine POST Anfrage ein.
Auf jeder Seite lässt du Platz um den Inhalt der Anfrage zu posten und auf Anfragen die du nicht lesen kannst Antwortest du dem Browser wie beim ersten Schritt mit der Anfrage als Antwort um zu verstehen was genau der Browser da gesendet hat.
So hangelst du dich dann bei deinem Adress-Parser langsam vorwärst und musst nicht in einem einzelnen Codeblock rumstricken
Geändert von Ceos (21.10.2019 um 14:28 Uhr)
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
Lesezeichen