Anfrage: wie schaltet man bei fsockopen einen proxy dazwischen ? Danke.

Hallo,

wie lässt man eine Anfrage über einen Proxy (123.456.789.111:80) laufen ?

habe bisher:

$fp = fsockopen("zieladresse.de", 80);
  fputs($fp, "GET $path HTTP/1.1\r\n");
  fputs($fp, "Keep-Alive: 120\r\n");
  fputs($fp, "Connection: keep-alive\r\n");

Was muss jetzt noch hinzugefügt werden, um das ganze über einen Proxy laujfen zu lassen ?

Thanks

  1. Hi!

    Was muss jetzt noch hinzugefügt werden, um das ganze über einen Proxy laujfen zu lassen ?

    Nach meinem Wissensstand verbindet man sich nicht mit dem Zielserver sondern mit dem Proxy und stellt dem den sonst üblichen Request. Allerdings mit Host-Header, sonst weiß er ja nicht, wohin er sich wenden muss.

    Lo!

    1. Moin!

      Was muss jetzt noch hinzugefügt werden, um das ganze über einen Proxy laujfen zu lassen ?

      Nach meinem Wissensstand verbindet man sich nicht mit dem Zielserver sondern mit dem Proxy und stellt dem den sonst üblichen Request. Allerdings mit Host-Header, sonst weiß er ja nicht, wohin er sich wenden muss.

      Nein, nicht ganz. Die Zielangabe der HTTP-Methode enthält nicht nur den Pfad, sondern die gesamte URL.

      Sniffen einer Browser-Proxy-Verbindung würde es erklären - oder das Lesen von http://www.faqs.org/rfcs/rfc2616.html.

      - Sven Rautenberg

      1. Hi!

        Nein, nicht ganz. Die Zielangabe der HTTP-Methode enthält nicht nur den Pfad, sondern die gesamte URL.
        Sniffen einer Browser-Proxy-Verbindung würde es erklären - oder das Lesen von http://www.faqs.org/rfcs/rfc2616.html.

        Gut. Gesnifft habe ich nicht direkt, aber mit der livehttpheader-Extension geschaut, und da sah ich nur

        GET / HTTP/1.1
        Host: google.de
        usw.

        Ich hab sogar die RFC 2068 (wieso steht da nicht, dass die obsolet ist?) durchgeblättern, denn vor Zeiten hatte ich in einer solchen schon einmal das Proxy-Handling nachgelesen. Nur jetzt hatte ich nicht intensiv genug gesucht, nichts gefunden und es dann aufgegeben. Wenn du die entsprechende Stelle in RFC 2616 noch aufgeschlagen hast, sag doch bitte mal die Kapitelnummer. Danke.

        Lo!

        1. GET / HTTP/1.1
          Host: google.de
          usw.

          es soll ja mit  :

          $fp = fsockopen($proxy,8080);
          fputs($fp, 'GET http://www.google.de HTTP/1.0\r\nHost:www.google.de:80\r\n\r\n');

          gehen, aber nicht bei mir, sieht jemand den Fehler oder hat eine Lösung ?

          Thanks

          1. Hallo,

            es soll ja mit  :
            $fp = fsockopen($proxy,8080);
            fputs($fp, 'GET http://www.google.de HTTP/1.0\r\nHost:www.google.de:80\r\n\r\n');
            gehen, aber nicht bei mir, sieht jemand den Fehler oder hat eine Lösung ?

            ja, du sprichst kein korrektes HTTP. Beachte außerdem, dass PHP in Strings, die in einfachen Anführungszeichen notiert werden, keine Steuerzeichen oder Variablenersetzungen auswertet.

            Nach dem Methodennamen GET folgt nur der Host-relative Teil der URL (hier also nur "/") und die HTTP-Version. Der Hostname wird ja in einem separaten Header mitgeteilt. Das Präfix "http:" ist hier völlig fehl am Platz - es ist anhand des Kontextes schon hinreichend klar, dass es um HTTP-Kommunikation geht. Im Duden steht auch nicht vor jedem Schlagwort nochmal "Deutsch:" davor.

            Ergo:

            $fp = fsockopen($proxy,8080);
            fputs($fp, "GET / HTTP/1.0\r\nHost: www.google.de\r\n\r\n");

            So long,
             Martin

            PS: Du plenkst!

            --
            Niemand ist überflüssig: Er kann immer noch als schlechtes Beispiel dienen.
            1. Ergo:

              $fp = fsockopen($proxy,8080);
              fputs($fp, "GET / HTTP/1.0\r\nHost: www.google.de\r\n\r\n");

              So long,
              Martin

              stimmt schon, ich habe mal wie folgt probiert (der Proxy funzt) :

              $fp = fsockopen("84.1.150.30", 8080,$errno, $errstr, 30);

              if (!$fp) {
                   echo "$errstr ($errno)";
                          }
                else {
                fputs($fp, "GET / HTTP/1.1\r\n");
                fputs($fp, "Keep-Alive: 120\r\n");
                fputs($fp, "Proxy-Connection: keep-alive\r\n");
                fputs($fp, "Host: www.google.de\r\n");
                fputs($fp, "Content-type: text/html\r\n");
                fputs($fp, "Connection: close\r\n\r\n");

              while(!feof($fp)) {
                    $res .= fgets($fp, 128);
                                  }
                      }

              Dennoch kommt:

              Warning: fsockopen() [function.fsockopen]: unable to connect to 84.1.150.30:8080 (Connection timed out)

              Auch da RFC Handbuch hilft nicht wirklich weiter ...

              Ideen ?

              1. Hallo,

                fputs($fp, "GET / HTTP/1.1\r\n");
                  fputs($fp, "Keep-Alive: 120\r\n");
                  fputs($fp, "Proxy-Connection: keep-alive\r\n");
                  fputs($fp, "Host: www.google.de\r\n");
                  fputs($fp, "Content-type: text/html\r\n");
                  fputs($fp, "Connection: close\r\n\r\n");

                Was soll der Content-Type-Header im *Request*? Den liefert der Server mit dem Response!

                Dennoch kommt:
                Warning: fsockopen() [function.fsockopen]: unable to connect to 84.1.150.30:8080 (Connection timed out)

                Aha. Da ist also kein Proxy, der auf 84.1.150.30:8080 reagiert. Bist du sicher, dass du diesen ungarischen Proxy (wenn's denn stimmt) so nutzen kannst und darfst?

                Ciao,
                 Martin

                --
                Zwischen Leber und Milz
                passt immer noch'n Pils.
                1. Aha. Da ist also kein Proxy, der auf 84.1.150.30:8080 reagiert. Bist du sicher, dass du diesen ungarischen Proxy (wenn's denn stimmt) so nutzen kannst und darfst?

                  Ciao,
                  Martin

                  ... Also per Browser angesprochen funktioniert der Proxy.
                  hmmm, gibt es denn einen Unterschied ob der Proxy per browser oder per fsockopen angesprochen wird, das merkt der doch nicht ... oder liege ich da falsch ?

                  1. Hi,

                    Aha. Da ist also kein Proxy, der auf 84.1.150.30:8080 reagiert.
                    ... Also per Browser angesprochen funktioniert der Proxy.
                    hmmm, gibt es denn einen Unterschied ob der Proxy per browser oder per fsockopen angesprochen wird, das merkt der doch nicht ... oder liege ich da falsch ?

                    keine Ahnung - dann lies doch mal den HTTP-Verkehr zwischen Browser und Proxy mit. Die LiveHTTP-Extension leistet da schon gute Dienste (ich hab jetzt aber keine Lust, meinen Browser umzukonfigurieren).

                    Ciao,
                     Martin

                    PS: Du plenkst immer noch! Und bitte kein TOFU. Danke.

                    --
                    Die neue E-Mailadresse des Papstes: mailto:urbi@orbi
                  2. Hallo,

                    Aha. Da ist also kein Proxy, der auf 84.1.150.30:8080 reagiert. Bist du sicher, dass du diesen ungarischen Proxy .. so nutzen kannst und darfst?
                    ... Also per Browser angesprochen funktioniert der Proxy.

                    wen ich im Browser http://84.1.150.30:8080 aufrufe bekomme ich einen Status 401 zurück. Da der Proxy erstaunlicherweise kein WWW-Authenticate-Header einfügt, funktioniert bereits die Software des Servers nicht.

                    hmmm, gibt es denn einen Unterschied ob der Proxy per browser oder per fsockopen angesprochen wird ...?

                    Prinzipiell nicht.

                    Allgemein ist es schon erstaunlich, wie viele jetzt auf einmal hier im Forum Proxies mit ihren PHP-Scripten ansprechen wollen. Was ist denn los? Sind Eure Liebnlingsseiten auf einmal mit einem Stop-Schild versehen?

                    Gruß aus Berlin!
                    eddi

                    --
                    Könnte bitte jemand mal langsam dafür sorgen, dass da draußen nicht dauernd die Filmrolle "Planet der Affen" abgedudelt wird? Danke!
          2. Hi!

            es soll ja mit  :
            $fp = fsockopen($proxy,8080);
            fputs($fp, 'GET http://www.google.de HTTP/1.0\r\nHost:www.google.de:80\r\n\r\n');
            gehen, aber nicht bei mir, sieht jemand den Fehler oder hat eine Lösung ?

            Lass die Host-Zeile mal weg. Da die vollständige URL bereits hinter dem GET angegeben ist, wäre die Host-Angabe überflüssig (nach meinem Gefühl).

            "Geht nicht" reicht übrigens als Fehlerbeschreibung selten. Beobachte und beschreibe das Nicht-Gehen bitte genauer, inklusive Fehlermeldungen. Wertest du die Rückgabewerte der Funktionen (zum Beispiel den von fsockopen()) aus und hast diese Auswertung nur hier im Codezitat weggelassen oder fehlt die Auswertung auch im Original?

            Lo!

            1. Lass die Host-Zeile mal weg.

              Bitte lies doch erstmal die RFC wie es Dir Sven bereits antrug. Der von Martin erklärte Strig-Kontext sieht erheblich erfolgversprechenden aus, als Deine Gefühlshandlungen.

              Gruß aus Berlin!
              eddi

              --
              Könnte bitte jemand mal langsam dafür sorgen, dass da draußen nicht dauernd die Filmrolle "Planet der Affen" abgedudelt wird? Danke!
              1. Hi!

                Bitte lies doch erstmal die RFC wie es Dir Sven bereits antrug. Der von Martin erklärte Strig-Kontext sieht erheblich erfolgversprechenden aus, als Deine Gefühlshandlungen.

                Ja, entschuldige bitte, auf die String-Begrenzer hatte ich nciht geachtet. Nachdem ich Martins Post las, war mir das auch klar.

                Die RFC ist mir momentan zu lang zum Lesen. Ich blätterte ja schon darin, jedoch ohne Erfolg. Deswegen bat ich ja um eine Präzisierung der Stelle in der RFC.

                Lo!

        2. Hallo Dedlfix,

          (wieso steht da nicht, dass die obsolet ist?)

          nimm für RFCs am besten die Tools im URL (http://tools.ietf.org/html/rfc2068) nebst sinnvoller Transformation zu HTML für eine genauere Referenzierung sind eben auch Information zum Stand der RFC oben ablesbar.

          Gruß aus Berlin!
          eddi

          --
          Könnte bitte jemand mal langsam dafür sorgen, dass da draußen nicht dauernd die Filmrolle "Planet der Affen" abgedudelt wird? Danke!
      2. Hallo Ihr beide,

        Allerdings mit Host-Header, sonst weiß er ja nicht, wohin er sich wenden muss.
        Nein, nicht ganz.

        das möchte ich wohl auch meinen. Der Host-Header ist Bestandteil der RFC 2616, die nach RFC 2119 zu lesen ist: "A client MUST include a Host header field in all HTTP/1.1 request messages."

        Die Zielangabe der HTTP-Methode enthält nicht nur den Pfad, sondern die gesamte URL.

        Das verstehe ich nicht, wie es gemeint ist. Die Methode hat keine Zielangabe.
        Jedenfalls betrifft das u. a. Abs. 5.1.2.

        Gruß aus Berlin!
        eddi

        --
        Könnte bitte jemand mal langsam dafür sorgen, dass da draußen nicht dauernd die Filmrolle "Planet der Affen" abgedudelt wird? Danke!