Files
SuccessfulCodeTools/SuccessfulCodeTools/LowLevelHttpClient/CustomHttpClient.cs
T
Martin e2556fae85
SuccessfulCode/SuccessfulCodeTools/master This commit looks good
Remove locking. Unforseen deadlock
2020-02-26 09:59:17 +00:00

67 lines
2.4 KiB
C#

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace SuccessfulCodeTools.LowLevelHttpClient
{
public class CustomHttpClient
{
public int? OutgoingPort { get; set; }
public KeyValueCollection<string, string> DefaultHeaders = new KeyValueCollection<string, string>();
public CustomHttpClient(int? outgoingPort = null)
{
OutgoingPort = outgoingPort;
}
public async Task<CustomHttpResponseMessage> SendAsync(CustomHttpRequestMessage message, int? outgoingPort = null)
{
var defaultHeaders = DefaultHeaders.Where(e => !message.Headers.Contains(e)).ToArray();
message.Headers.AddRange(defaultHeaders);
var outBoundPort = outgoingPort ?? OutgoingPort ?? 0;
var ipLocalEndPoint = new IPEndPoint(IPAddress.Any, outBoundPort);
using (var tcp = new TcpClient(ipLocalEndPoint))
{
var remoteEndpoint = new IPEndPoint(Dns.GetHostEntry(message.Uri.Host).AddressList[0], 80);
tcp.Connect(remoteEndpoint);
tcp.LingerState.Enabled = false;
tcp.LingerState.LingerTime = 0;
tcp.SendTimeout = 500;
tcp.ReceiveTimeout = 1000;
// Send request headers
//builder.AppendLine("Content-Length: " + data.Length); // only for POST request
var request = message.ToString();
var header = Encoding.ASCII.GetBytes(request);
var stream = tcp.GetStream();
await stream.WriteAsync(header, 0, header.Length);
// Send payload data if you are POST request
//await stream.WriteAsync(data, 0, data.Length);
// receive data
using (var memory = new MemoryStream())
{
await stream.CopyToAsync(memory);
tcp.Client.Disconnect(true);
stream.Close();
tcp.Client.Close();
return new CustomHttpResponseMessage(memory);
}
}
}
}
}