Announcement

Collapse
No announcement yet.

Dragonfly HttpLogger

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dragonfly HttpLogger

    Hallo zusammen!

    Mein Problem:
    Ich habe bereits ein C++ Programm geschrieben, das einen eingebetteten Web-Browser besitzt. Das "window" des Browsers möchte ich nun so überwachen lassen, dass ich alle client-seitigen (ausgehenden) XMLHttpRequests geloggt bekomme. Im Prinzip interessiere ich mich nur an den URIs, an die ein request gesendet wird. Mein C-Programm soll diese URIs dann sofort untersuchen können.

    Ein Ansatz:
    Der Dragonfly HttpLogger von Opera hat fast die gewünschte Funktionalität. Es geht mir letztlich um das OnRequest-Event. Der Quellcode ist auch frei zugänglich, aber ich kriegs einfach nich gebacken, den benötigten Code rauszusuchen und meinen Anforderungen anzupassen.

    Hier kann man alle Dragonfly Versionen einsehen:
    https://dragonfly.opera.com/app/zips/

    Da es sich hierbei um Javascripts handelt, und Dragonfly von Haus aus in einem Frameset arbeitet, würde ich das "Logfile" in ein verstecktes Frame schreiben (in dem auch mein Logger arbeitet) und vom C-Programm pollen lassen.

    Meine Bitte:
    Ich hoffe mir kann jemand bei meinem Ansatz weiterhelfen, oder gleich eine andere Variante vorschlagen. Wenn möglich bitte mit Anleitung, oder Code-Schnippseln. Ich bin Anfänger.

  • #2
    Ich habe bereits ein C++ Programm geschrieben, das einen eingebetteten Web-Browser besitzt.
    Dann solltest du bereits Zugriff auf alle Requests haben; schließlich ist es ja dein Programm??
    Christian

    Comment


    • #3
      Nunja, mit dem WebBrowser meinte ich nur das ActiveX-Objekt, das IE-Funktionalitäten bietet. Ich selbst habe keine eigene Webanwendung, oder wie man das auch immer nennen mag. Vielmehr möchte ich - mir bis dato unbekannte - Requests entdecken können. Beispielsweise könnte ich meinen Browser auf beliebige, bereits existierende Seiten navigieren und deren Request-Verhalten untersuchen. Eben nach dem Vorbild Dragonfly. Jedoch mit programmatischen Zugriff auf den Log, damit mein Programm die Daten auswerten kann und über weitere Schritte entscheidet.

      Beispiel:
      1.) Mein Logger setzt das Event: OnRequest, das dann feuert, wenn ein beliebiges Script auf der Seite (also im window-objekt des geladenen Dokuments) einen XMLHttpRequest eröffnet, sendet oder abschließt. Welcher Fall ist mir egal.
      2.) Ich navigiere meinen Browser auf "http://page1.com"
      3.) Ein Skript irgendwo in dem Fenster führt folgendes aus:
      var oReq = new XMLHttpRequest;
      oReq.open("GET", "http://page2.com/add_member?name=Jhon&age=20");
      oReq.send();
      4.) Mein Logger protokolliert "http://page2.com/add_member?name=Jhon&age=20" und übergibt die Daten an mein Programm.

      Comment


      • #4
        Ich kann da nicht so unterscheiden, was "dein" Programm ist und was nicht.

        Des Weiteren bezweifle ich, dass du den IE in Form des ActiveX-Objektes dazu überreden kannst mit einem Opera-Programmteil zusammen zu arbeiten. Denn irgendwie müsstest du dazu ja in das ActiveX eingreifen können. Und sollte das ActiveX eine entsprechende Schnittstelle bieten, wäre das Opera-Programmteil überflüssig

        Würde das ganze mal sauber aufsetzen. Mit einem eigenen Browser, der entsprechende Funktionalität bietet. Für VC, Borland u.a. gibt es da im Bereich der C/C++ Programmierung Standardkomponenten
        Christian

        Comment


        • #5
          Mein "Programm" erstellt mir eine extrem simple graphische Benutzeroberfläche mit Buttons, etc. Dann hab ich da noch meinen eingebetteten IE. (Ich will mir eigentlich keinen eigenen Browser schreiben müssen). Mein Programm verwaltet also somit die Oberfläche und die Ansteuerung des Browsers.

          Das wars dann auch. Mehr kann es nicht.
          Nun soll der Anwender auf eine völlig beliebige Seite navigieren können und über die Requests informiert werden, die von dieser Seite ausgehen.
          Optimal wäre es jetzt eben, wenn das Programm noch das mit dem Loggen hinkriegen könnte und nicht in wie meiner ersten Idee (siehe unten) in einem javascript "ausgelagert" werden muss.

          Meine erste Idee war ja, dass ich ein FrameSet in meinem Browser öffne, bei dem in einem Frame die gewünschte Webseite geladen wird und in dem anderen Frame der Logger (als Javascript), da mir Dragonfly den Anschein machte, als sei es komplett in Javascript geschrieben (und somit unabhängig vom Browser). Im Opera-Browser sitzt es ja auch in einem Frame. Dann könnte ich mal eben den relevanten Code aus Dragonfly rauskopieren, ein wenig anpassen und für mich verwenden. Ich weiß, das ist ziemlich gepfuscht, aber ich wollte eben eine schnelle Lösung.

          Und wie gesagt: Ich hab keine Ahnung, wie ich die Funktionalität selbst realisieren soll.

          Ich hoffte also darauf, dass das Script keine Programmteile von Opera selbst nutzen muss, woran ich aber inzwischen zweifle.

          Ich denke, dass ich diese Idee wohl verwerfen muss.

          Mein Problem bleibt aber: Ich möchte die XMLHttpRequests einer beliebigen geöffneten Seite protokollieren.

          Ich bitte um konkrete Lösungsvorschläge.

          Comment


          • #6
            Ich bitte um konkrete Lösungsvorschläge.
            Siehe oben

            Des Weiteren kannst du mit Javascript keine Dateien schreiben o.a.
            Christian

            Comment


            • #7
              1.) Dass ich mit Javascript keine Dateien speichern kann ist mir klar. Darum würde ich den Log einfach geschickt in das DOM der Seite schreiben - z.B. in ein verstecktes 'DIV' oder 'FRAME' - und das Element dann zyklisch vom C-Programm auslesen lassen.

              2.) Mein eigentliches Problem war bis jetzt ja lediglich die Umsetzung des Loggers in Code!
              Glücklicherweise bin ich gerade auf die Lösung gestoßen. Und meine Vermutung, dass der Logger aus Dragonfly für diese Aufgabe reines Javascript benutzt hat sich bestätigt.

              Der "Trick" besteht darin, dass Javascript eine Prototyp-basierte Sprache ist und man die Prototypen einfach nur überschreiben muss. (Dieses Wissen fehlte mir eben)

              Siehe hier! Ganz unten auf der Seite steht der relevante Code.

              Somit wäre (fast) alles geklärt.

              Mein letztes Anliegen:
              Da diese Methodik ja vom Überschreiben des Prototypen lebt, denke ich mal, dass ich strikt an den Javascript-Code-Schnippsel gebunden bin und den irgendwie in das Browser-Fenster einschleusen muss!?
              Wie mache ich das am elegantesten?
              Gibt es Alternativen zu der Methodik?

              Comment

              Working...
              X