Files
I150/srcs/RobotNet10/Commons/RobotNet10.ScriptEngine/IO/HttpConnection.cs
2026-07-03 16:37:12 +07:00

124 lines
4.0 KiB
C#

using System.Net.Http.Headers;
using RobotNet10.Script.IO;
namespace RobotNet10.ScriptEngine.IO;
/// <summary>
/// Implementation of HTTP connection using HttpClient.
/// </summary>
public class HttpConnection : IHttpConnection
{
private readonly HttpClient _httpClient;
private bool _disposed;
public string BaseUrl { get; }
public bool IsConnected { get; private set; }
public HttpConnection(string baseUrl, TimeSpan? timeout = null)
{
BaseUrl = baseUrl.TrimEnd('/');
_httpClient = new HttpClient
{
BaseAddress = new Uri(BaseUrl),
Timeout = timeout ?? TimeSpan.FromSeconds(30)
};
IsConnected = false;
}
public async Task ConnectAsync()
{
// HTTP doesn't require explicit connection, but we can verify connectivity
try
{
var response = await _httpClient.GetAsync("/");
IsConnected = true;
}
catch
{
IsConnected = false;
throw;
}
}
public Task DisconnectAsync()
{
IsConnected = false;
return Task.CompletedTask;
}
public async Task<string> GetAsync(string path, Dictionary<string, string>? headers = null)
{
EnsureConnected();
using var request = new HttpRequestMessage(HttpMethod.Get, path);
AddHeaders(request, headers);
var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
public async Task<string> PostAsync(string path, string content, string contentType = "application/json", Dictionary<string, string>? headers = null)
{
EnsureConnected();
using var request = new HttpRequestMessage(HttpMethod.Post, path);
request.Content = new StringContent(content);
request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType);
AddHeaders(request, headers);
var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
public async Task<string> PutAsync(string path, string content, string contentType = "application/json", Dictionary<string, string>? headers = null)
{
EnsureConnected();
using var request = new HttpRequestMessage(HttpMethod.Put, path);
request.Content = new StringContent(content);
request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType);
AddHeaders(request, headers);
var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
public async Task<string> DeleteAsync(string path, Dictionary<string, string>? headers = null)
{
EnsureConnected();
using var request = new HttpRequestMessage(HttpMethod.Delete, path);
AddHeaders(request, headers);
var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
private static void AddHeaders(HttpRequestMessage request, Dictionary<string, string>? headers)
{
if (headers != null)
{
foreach (var header in headers)
{
request.Headers.Add(header.Key, header.Value);
}
}
}
private void EnsureConnected()
{
if (!IsConnected)
{
throw new InvalidOperationException("HTTP connection is not connected. Call ConnectAsync() first.");
}
}
public void Dispose()
{
if (!_disposed)
{
_httpClient?.Dispose();
IsConnected = false;
_disposed = true;
}
GC.SuppressFinalize(this);
}
}