Mecki: http request widerrufen

Hallo Forum

Ich habe ein Script, das mit einem Webserver kommuniziert, der Teil von embedded Software einer kleinen Maschine ist. Der Webserver versteht aber nur GET (kein Post oder irgend etwas anderes)
Jetzt muss ich die Maschine zu einem Neustart zwingen, was über ein Token hinter dem Aufruf funktioniert.
über http request schicke ich ein

  
GET http://<ipAddresse>/daten.xml?action=reset  

an die Maschine.
Mit dem Neustart wird aber auch der webserver für 30 sekunden inaktiv, die daten.xml kommt also nie zurück.
Das gibt dann nach ca 20s eine Fehlermeldung, auf die ich gern verzichten würde.
Wie kann ich den http request sozusagen anullieren, damit der Browser nicht auf die daten.xml wartet?

Danke
Mecki

  1. Hi,
    Stichwort "fire and forget". Vielleicht mal suchen.

  2. Mahlzeit,

    Mit dem Neustart wird aber auch der webserver für 30 sekunden inaktiv, die daten.xml kommt also nie zurück.

    Und wieso sendest du nicht VOR dem Neustart ein ACK o.ä. zurück? Sonst kannst du ja nur vermuten, dass der Befehl angenommen und ausgeführt wird.

    --
    42
    1. Moin Moin!

      Mit dem Neustart wird aber auch der webserver für 30 sekunden inaktiv, die daten.xml kommt also nie zurück.

      Und wieso sendest du nicht VOR dem Neustart ein ACK o.ä. zurück?

      Weil er den embedded-Webserver nur per HTTP-Request steuert und nicht programmiert?

      Ich habe ein Script, das mit einem Webserver kommuniziert, der Teil von embedded Software einer kleinen Maschine ist.

      Mit anderen Worten: Der Webserver in der Maschine ist zu blöd, Mecki braucht einen Workaround.

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
      1. Mahlzeit,

        Weil er den embedded-Webserver nur per HTTP-Request steuert und nicht programmiert?

        Dann weisst du mehr als ich. Mit dieser Info hätte ich mir meine Antwort sparen können.

        Mit anderen Worten: Der Webserver in der Maschine ist zu blöd, Mecki braucht einen Workaround.

        Dumm nur, dass du erst die Info lieferst, die Mecki im OP hätte bringen sollen.

        --
        42
        1. Mahlzeit,

          Weil er den embedded-Webserver nur per HTTP-Request steuert und nicht programmiert?

          Dann weisst du mehr als ich. Mit dieser Info hätte ich mir meine Antwort sparen können.

          Mit anderen Worten: Der Webserver in der Maschine ist zu blöd, Mecki braucht einen Workaround.

          Dumm nur, dass du erst die Info lieferst, die Mecki im OP hätte bringen sollen.

          Hallo Alexander

          Auf die Idee, die Fehlermeldung auszublenden, hätte ich natürlich auch selbst kommen können. Ich weiss ja, wann sie kommen muss.
          Aber ich hatte gehofft, es gäbe da eine andere Möglichkeit. Sozusagen ein kleineres Pflaster.

          Danke

          @M: Ich dachte, das wäre klar gewesen, dass ich den Webserver nicht programmiere. Ich kann nur auf Clientseite etwas machen. Aber vielleicht kann ich mit dem Hersteller der Maschinensteuerung etwas entsprechendes vereinbaren.

          1. Moin Moin!

            Hallo Alexander

            Auf die Idee, die Fehlermeldung auszublenden, hätte ich natürlich auch selbst kommen können. Ich weiss ja, wann sie kommen muss.
            Aber ich hatte gehofft, es gäbe da eine andere Möglichkeit. Sozusagen ein kleineres Pflaster.

            https://forum.selfhtml.org/?t=215958&m=1479575 hast Du gelesen und verstanden?

            Aber vielleicht kann ich mit dem Hersteller der Maschinensteuerung etwas entsprechendes vereinbaren.

            Am sinnvollsten wäre, dass sich das System HTTP-konform verhält, sprich: Vor dem Reset noch eine letzte Antwort gibt. Siehe https://forum.selfhtml.org/?t=215958&m=1479575.

            Alexander

            --
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
          2. Mahlzeit,

            @M: Ich dachte, das wäre klar gewesen, dass ich den Webserver nicht programmiere. Ich kann nur auf Clientseite etwas machen.

            Nein, das war mir nicht klar. Ich hab solche Steuerungen entweder selbst programmiert oder zumindest in so weiten Bereichen konfigurieren können, dass ich eine Antwort auf nen XML-Request bekomme.

            Aber vielleicht kann ich mit dem Hersteller der Maschinensteuerung etwas entsprechendes vereinbaren.

            Wäre sinnvoll, denn dieses Problem hast wohl nicht nur du. An sich sollte der Hersteller schon alleine soweit denken. Aktion ohne Bestätigung ist in einer Maschinensteuerung ein absolutes NoGo wie ich meine.

            --
            42
        2. Moin Moin!

          Weil er den embedded-Webserver nur per HTTP-Request steuert und nicht programmiert?

          Dann weisst du mehr als ich. Mit dieser Info hätte ich mir meine Antwort sparen können.

          Mit anderen Worten: Der Webserver in der Maschine ist zu blöd, Mecki braucht einen Workaround.

          Dumm nur, dass du erst die Info lieferst, die Mecki im OP hätte bringen sollen.

          Dir ist schon klar, dass ich nur das Original-Posting zitiert habe?

          Alexander

          --
          Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
          1. Mahlzeit,

            Dir ist schon klar, dass ich nur das Original-Posting zitiert habe?

            Nein, aber du kannst gerne nochmal den Teil des OP direkt zitieren, denn auch nach nochmaligen Nachlesen steht da nichts derartiges.

            Die Antwort von Mecki bestätigt das recht eindrucksvoll

            --
            42
  3. Moin Moin!

    Mit dem Neustart wird aber auch der webserver für 30 sekunden inaktiv, die daten.xml kommt also nie zurück.
    Das gibt dann nach ca 20s eine Fehlermeldung, auf die ich gern verzichten würde.
    Wie kann ich den http request sozusagen anullieren, damit der Browser nicht auf die daten.xml wartet?

    Im Browser vermutlich gar nicht oder nur mit viel Trickserei. HTTP definiert, das der Webserver zu antworten hat, entsprechend ist der Browser gebaut. Du müßtest selbst eine TCP-Connection aufbauen, an großen Teilen der Browser-Logik vorbei, dort den GET-Request reinschreiben, und - ganz wichtig - anders als der Browser eben NICHT auf eine Antwort warten. Vermutlich reicht so etwas wie

      
    // Pseudo-Code!  
    var socket=openSocket("web.server.lan",80);  
    socket.write("GET /daten.xml?action=reset HTTP/1.1\r\nHost: web.server.lan\r\n\r\n");  
    // oder HTTP/1.0:  
    socket.write("GET /daten.xml?action=reset HTTP/1.0\r\n\r\n");  
    socket.close();  
    
    

    Wenn Du Zugriff auf den Source-Code des Embedded-Systems hast, sorge einfach dafür, das unmittelbar vor Auslösen des Resets minimal noch ein "200 OK" mit minimalem Content oder notfalls "204 No Content" gesendet wird.

    Vielleicht könnte ein wenig AJAX funktionieren: Mit Javascript und XMLHttpRequest hast Du die Möglichkeit, SELBST mit eigenem Code auf Fehler aller Art zu reagieren. Die Fehlermeldung wegen der ausbleibenden Antwort kannst Du dann ganz entspannt ignorieren.

    Ohne Javascript und ohne Zugriff auf den Source-Code des Embedded-Systems bleibt wohl nur, das etwas garstige Verhalten des Systems zu dokumentieren und damit zu leben.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
  4. Also, ich weiß ja nicht was Du serverseitig bestimmen kannst...

    1.)
    Du müsstest http://<ipAddresse>/daten.xml?action=reset nach etwas wie http://<ipAddresse>/restart.php umleiten

    2.)

    <?php  
    ### restart.php  
      
    # Hier Authentifizierung einfügen  
      
    header('HTTP/1.1: 204');  
    $dummy=`sudo reboot &`; # Backticks!  
    #EOF
    

    3.)
    Natürlich muss der effektive Benutzer (meist der Webserver oder der Besitzer der restart.php) in /etc/sudoers stehen, damit der den Befehl ausführen kann.

    Jörg Reinholz