2009-03-10 10 views
0

ich die Annahme einer Anfrage POST etwa so:Wie liest man am besten eine HTTP-POST-Anfrage von einem Socket-Byte-Stream?

Socket connection = m_connection; 
Byte[] receive = new Byte[1024]; 

int received = connection.Receive(receive); 
Console.WriteLine(received.ToString()); 

string request = Encoding.ASCII.GetString(receive); 
Console.WriteLine(request); 

Die Postwerte am Ende seltsam zu sein, wenn ich poste Text viele Male Werte sie mit viel + 's hinter ihnen enden. Wenn ich C schreiben: \ Benutzer \ John Doe \ wwwroot, endet es bis Wesen: C% 3A% 5CUsers% 5John + Doe% 5Cwwwroot

index.html index.html

++++++++++++++++++++++++++++++++ wird es scheint, ich bin immer die Irgendwie falsch kodieren, aber ich habe mehrere Kodierungen ausprobiert, und sie haben dieselbe Seltsamkeit. Wie liest man am besten eine HTTP-POST-Anfrage von einem Socket-Byte-Stream?

Antwort

1

Sie sollten System.Web.HttpUtility.UrlDecode not Encoding.ASCII verwenden, um die Decodierung durchzuführen.

Sie werden wahrscheinlich mit der Übergabe von Encoding.Default als zweiten Parameter dieser statischen Methode durchkommen.

Sie sehen das Ergebnis eines HTML-Formulars POST, das die Werte so codiert, als ob sie an eine URL als Suchzeichenfolge angehängt würden. Daher ist es ein & begrenzter Satz von Name = Wert-Paaren. Alle Out-of-Band-Zeichen werden mit ihrem Hexadezimalwert% xx codiert.

Die UrlDecode-Methode wird das alles für Sie decodieren.

Wie andere angegeben haben, müssen Sie wirklich den Strom in Stücke, es kann größer sein, dass 1K.

Genau genommen sollten Sie die Content-Type-Header für alle überprüfen; CharSet = Attribut. Wenn vorhanden, müssen Sie sicherstellen, dass der Zeichencode, den Sie an UrlDecode übergeben, für diesen Zeichensatz geeignet ist (z. B. wenn Zeichensatz = UTF-8, dann Encoding.UTF8 verwenden).

2

Sie müssen das Bytearray receive trimmen, das Sie an die GetString-Methode übergeben. Jetzt übergeben Sie alle 1024 Bytes, sodass die GetString-Methode versucht, diese so gut wie möglich zu codieren.

Sie müssen die received Variable verwenden, um die Grenzen für die zu codierende Zeichenfolge anzugeben.

1

Zuerst müssen Sie die Eingabe nicht dekodieren, HTTP ist ASCII und es ist schneller, nur mit Bytes zu arbeiten. Nun, was Sie tun wollen, ist, dass Sie eine maximale HTTP-Anfrage Header-Größe, sagen wir 4K? und dann werden Sie weiterhin Bytes lesen, bis Sie \ r \ n \ r \ n drücken, was das Ende der HTTP-Anfrage signalisiert. Sie müssen dieses maximale Limit für die Header-Größe erzwingen, da sonst ein einzelner böswilliger Benutzer eine unendliche HTTP-Anfrage senden könnte und Ihr Server nicht mehr genügend Arbeitsspeicher hätte.

Sie sollten die HTTP-Spezifikation lesen.

Abhängig von Ihrer HTTP-Anfrage kann der HTTP-Inhalt viele Dinge sein und Sie müssen entsprechend handeln. Das HTTP-Protokoll selbst ist immer ASCII, Sie können es also nur als Bytes behandeln, aber der Inhalt kann sehr unterschiedlich codiert werden. Dies wird in der Regel durch den Header Content-Type: erklärt. Aber lesen Sie erneut die HTTP-Spezifikation.

Verwandte Themen