2016-03-21 2 views
2

Ich versuche, Network Address Translation für einige Testcode zu simulieren. Ich ordne virtuelle Benutzer auf hohe Portnummern zu, und wenn ich eine Anfrage von Benutzer 1 testen möchte, sende ich sie von Port 6000 (Benutzer 2, von 6001, usw.).Wie wird die Portnummer aus einer HTTP-Antwort mit Python abgerufen?

Allerdings kann ich die Portnummer in der Antwort nicht sehen.

 connection = httplib.HTTPConnection("the.company.lan", port=80, strict=False, 
              timeout=10, source_address=("10.129.38.51", 6000)) 
     connection.request("GET", "/portal/index.html") 
     httpResponse = connection.getresponse() 
     connection.close() 

httpResponse.status ist 200, aber ich habe nicht die Portnummer überall in der Antwort-Header sehen.

Vielleicht sollte ich eine niedrigere Socket-Funktionalität verwenden? Wenn ja, welches ist am einfachsten und unterstützt sowohl HTTP als auch FTP? Übrigens, ich möchte nur eingebaute Module verwenden, nichts, was ich installieren muss.


[Update] Ich hätte es klarer machen müssen; Ich muss wirklich die tatsächliche Port-Nummer in der Antwort erhalten, nicht nur daran erinnern.

+1

Sie könnten etwas von hier ziehen http://Stackoverflow.com/a/8835762/2141635 –

Antwort

2

Um die Antwort von @TimSpence abzuschließen, können Sie ein Socket-Objekt als Schnittstelle für Ihre Verbindung verwenden und dann mit einer API Ihre Daten als HTTP-Objekt behandeln.

host = 'xxx.xxx.xxx.xxx' 
port = 80 
address = (host, port) 

## socket object interface for a TCP connection 
listener_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 
           socket.IPPROTO_TCP) 
listener_socket.bind(address) 
listener_socker.listen(MAX_CONNECTIONS) 

## new_connection is the connection object you use to handle the data echange 
## source_address (source_host, source_port) is the address object 
## source_port is what you're looking for 
new_connection, source_address = listener_socket.accept() 

data = new_connection.recv(65536) 

## handle data as an HTTP object(for example as an HTTP request) 

new_connection.close() 
+0

Und dies wird mir helfen, die Port-Nummer in der Antwort zu bekommen (nachdem ich herausfinden, wie man eine HTTP-Anfrage senden)? – Mawg

+1

accept() gibt die Objektverbindung und die Adressenverbindung zurück und das Adressobjekt ist ein Tupel, das den Host 'xxx.xxx.xxx.xxx' und die Portnummer enthält, wie Sie aus dem Code entnehmen können, den ich deklariere und initialisiere' Adresse': 'Adresse = (Host, Port)' – JumpAlways

+0

Haben Sie gelöst? – JumpAlways

2

HTTP-Nachrichten enthalten nichts über Ports, so dass die httpResponse diese Informationen nicht haben wird.

Sie benötigen jedoch für jede Anforderung ein anderes Verbindungsobjekt (das einem anderen zugrunde liegenden Socket zugeordnet wird), sodass Sie diese Informationen vom HTTPconnection-Objekt abrufen können.

_, port = connection.source_address 

Hilft das?

+0

Sorry, verstehe ich nicht ganz. Wie bekomme ich die Portnummer von der Antwort? – Mawg

+0

Oh, ich denke ich sehe was du meinst. Ich sollte 'connection_1 = httplib.HTTPConnection',' connection_2 = httplib.HTTPConnection', etc? Leider wird das nicht funktionieren, aus Gründen, die ich erklären werde, wenn ich meine Frage aktualisiere. Entschuldigung, dass ich zuerst so klar bin, und plus eins für deine Antwort. – Mawg

0

In Anbetracht Ihrer Kommentare musste ich eine neue Antwort geben.

ich aber auch einen Nicht-Standard-Header host in Ihrem HTTPRespose setzen,
'Host: domain/IP:port', so dass Ihr Kunde kann es lesen, wenn es eine Antwort empfängt.


Serverantwort:

HTTP/1.1 200 OK 
Date: Day, DD Month YYYY HH:MM:SS GMT 
Content-Type: text/html; charset=UTF-8 
Content-Encoding: UTF-8 
Content-Length: LENGTH 
Last-Modified: Day, DD Month YYYY HH:MM:SS GMT 
Server: Name/Version (Platform) 
Accept-Ranges: bytes 
Connection: close 
Host: domain/IP:port         #exapmple: the.company.lan:80 

<html> 
<head> 
    <title>Example Response</title> 
</head> 
<body> 
    Hello World! 
</body> 
</html> 


Auftraggeber:

connection = httplib.HTTPConnection("the.company.lan", port=80, 
            strict=False, timeout=10, 
            source_address=("10.129.38.51", 6000)) 

connection.request("GET", "/portal/index.html") 
httpResponse = connection.getresponse() 

## store a dict with the response headers 
## extract your custom header 'host' 
res_headers = dict(httpResponse.getheaders()); 
server_address = tuple(headers['host'].split(':')) 

## read the response content 
HTMLData = httpResponse.read(CONTENT_LENGTH_HEADER) 

connection.close() 


Auf diese Weise können server_address als Tupel bekam (domain, port).

Verwandte Themen