67 lines
2.4 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|