Reputation: 3677
I have a simple TcpListener and I want to parse the data it receives. Here is what I have and it works:
TcpListener listener = new TcpListener(localAddr, port);
var client = listener.AcceptTcpClient();
var buffer = new byte[10240];
var stream = client.GetStream();
var length = stream.Read(buffer, 0, buffer.Length);
var incomingMessage = Encoding.UTF8.GetString(buffer, 0, length);
results
Incoming message: POST /api/v1/myapi/ HTTP/1.1
Content-Type: application/json
ApiKey: dac38055e7914b1f8ca5de1683b58322
cache-control: no-cache
Postman-Token: 50da88e4-5c89-4368-a5eb-1574eb35b24a
User-Agent: PostmanRuntime/7.6.1
Accept: */*
Host: MyDNS:13000
accept-encoding: gzip, deflate
content-length: 590
Connection: keep-alive
AmazingDataFromBody
Is there anything that will parse this or do I have to write my own?
Upvotes: 1
Views: 1123
Reputation: 988
As i can see, you want to handle an HTTP Request, so:
TCPListener
use HttpListener
to handle HTTP Request and Response. Link: https://learn.microsoft.com/en-us/dotnet/api/system.net.httplistener?view=netframework-4.7.2HTTPLister
with your URI http:localhost[:port]/api/v1/myapi/
, using the host and port.Start
the HttpListener
.GetContext()
to get the HttpListenerRequest
object.HttpListenerRequest
you can get the Headers and body, check this link: https://learn.microsoft.com/en-us/dotnet/api/system.net.httplistenerrequest?view=netframework-4.7.2GetContext()
to get the HttpListenerResponse
object.Using the sample of https://learn.microsoft.com/en-us/dotnet/api/system.net.httplistener?view=netframework-4.7.2 you can see:
// This example requires the System and System.Net namespaces.
public static void SimpleListenerExample(string[] prefixes)
{
// 1
HttpListener listener = new HttpListener();
// 2
listener.Prefixes.Add("http:/localhost:8080//api/v1/myapi/");
// 3
listener.Start();
Console.WriteLine("Listening...");
//4
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
//5
HttpListenerResponse response = context.Response;
//Building a response
string responseString = "<HTML><BODY>My response</BODY></HTML>";
//Take care of encoding
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
//6
response.ContentLength64 = buffer.Length;
//Get the stream to wite the response body
System.IO.Stream output = response.OutputStream;
output.Write(buffer,0,buffer.Length);
// You must close the output stream.
output.Close();
listener.Stop();
}
if you don't want to use HttpListener
you can use these basic steps, using TCPListener
and TCPClient
but you must have knowledge about HTTP Protocol:
content-length
header.content-length
.In my case, i prefer use HttpListener
, which allows handle several aspect of HTTP, like certified.
Upvotes: 2