Auf Daten über Socket zugreifen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
iuiz
User
Beiträge: 1
Registriert: Montag 21. Dezember 2009, 15:03

Moin,

ich bin relativ neu in der Python Welt und arbeite mich momentan noch etwas in die Syntax ein, daher hoffe ich, dass meine Frage nicht zu doof ist :).

Mein Problem ist folgendes: Wir erstellen zurzeit einen Proxyserver, welcher Datei Downloads automatisch mitschneidet und die Metadaten, die in den Datein enthalten sind automatisch in eine Datenbank schreibt (also z.B. ID3 Tags bei MP3 Datein). Nach kurzem googlen habe ich auch einen funktionierenden Proxy gefunden. Mein Problem ist jetzt allerdings, wie ich auch die Daten in einem Stream zugreifen kann, ohne die Funktionalität des Streams zu beeinträchtigen.

Hier ist der entsprechende Code, der aufgerufen wird, wenn jemand auf eine Seite surft:

Code: Alles auswählen

def do_GET(self):
        (scm, netloc, path, params, query, fragment) = urlparse.urlparse(
            self.path, 'http')
        if scm != 'http' or fragment or not netloc:
            self.send_error(400, "bad url %s" % self.path)
            return
        soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            if self._connect_to(netloc, soc):
                self.log_request()
                soc.send("%s %s %s\r\n" % (
                    self.command,
                    urlparse.urlunparse(('', '', path, params, query, '')),
                    self.request_version))
                self.headers['Connection'] = 'close'
                del self.headers['Proxy-Connection']
                for key_val in self.headers.items():
                    soc.send("%s: %s\r\n" % key_val)
                soc.send("\r\n")
                self._read_write(soc)
        finally:
            print "\t" "bye"
            soc.close()
            self.connection.close()
Kann ich jetzt die Daten, die mit soc.send gesendet werden problemlos auslesen? Und wenn ja, wie geht das :).
Danke schonmal für die Hilfe.

Gruß,
iuiz



//edit:
Sorry, hab gerade gesehen, dass eine wichtige Methode fehlt:

Code: Alles auswählen

    def _read_write(self, soc, max_idling=20):
        iw = [self.connection, soc]
        ow = []
        count = 0
        while 1:
            count += 1
            (ins, _, exs) = select.select(iw, ow, iw, 3)
            if exs: break
            if ins:
                for i in ins:
                    if i is soc:
                        out = self.connection
                    else:
                        out = soc
                    data = i.recv(8192)
                    if data:
                        out.send(data)
                        count = 0
            else:
                print "\t" "idle", count
            if count == max_idling: break
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Zwischen Zeile 16 und 18 in deinem Nachtrag hast du doch einen Block der Daten aus dem Stream vorliegen. Mache damit einfach, was immer du willst. Du musst natürlich daran denken, dass das nur ein Teil ist und es so unter Umständen aufwendiger wird, die Teile wieder zu einem ganzen zusammenzusetzen, um da dann nach Informationen zu suchen. Ich weiß auch nicht, was da deine gefundene Proxy-Implementierung kann, aber HTTP/1.1 unterstützt auch Range-Requests die dazu führen könnten, dass der Client niemals alles vom Server holt, sondern nur Teile.

Stefan
Antworten