more on HttpWebRequest

This commit is contained in:
UbitUmarov
2023-05-17 21:17:36 +01:00
parent 6dbc498677
commit f3663371dc
3 changed files with 72 additions and 44 deletions

View File

@@ -269,6 +269,15 @@ namespace OpenSim.Framework
request.Headers.ExpectContinue = false; request.Headers.ExpectContinue = false;
request.Headers.TransferEncodingChunked = false; request.Headers.TransferEncodingChunked = false;
//if (keepalive)
{
request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10");
request.Headers.TryAddWithoutValidation("Connection", "Keep-Alive");
request.Headers.ConnectionClose = false;
}
//else
// request.Headers.TryAddWithoutValidation("Connection", "close");
cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(DefaultTimeout)); cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(DefaultTimeout));
if (WebUtil.DebugLevel >= 3) if (WebUtil.DebugLevel >= 3)

View File

@@ -411,6 +411,7 @@ namespace OpenSim.Framework
{ {
request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10"); request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10");
request.Headers.TryAddWithoutValidation("Connection", "Keep-Alive"); request.Headers.TryAddWithoutValidation("Connection", "Keep-Alive");
request.Headers.ConnectionClose = false;
} }
else else
request.Headers.TryAddWithoutValidation("Connection", "close"); request.Headers.TryAddWithoutValidation("Connection", "close");
@@ -560,6 +561,7 @@ namespace OpenSim.Framework
//{ //{
// request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10"); // request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10");
// request.Headers.TryAddWithoutValidation("Connection", "Keep-Alive"); // request.Headers.TryAddWithoutValidation("Connection", "Keep-Alive");
// request.Headers.ConnectionClose = false;
//} //}
//else //else
request.Headers.TryAddWithoutValidation("Connection", "close"); request.Headers.TryAddWithoutValidation("Connection", "close");
@@ -1178,6 +1180,7 @@ namespace OpenSim.Framework
{ {
request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10"); request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10");
request.Headers.TryAddWithoutValidation("Connection", "Keep-Alive"); request.Headers.TryAddWithoutValidation("Connection", "Keep-Alive");
request.Headers.ConnectionClose = false;
} }
else else
request.Headers.TryAddWithoutValidation("Connection", "close"); request.Headers.TryAddWithoutValidation("Connection", "close");
@@ -1273,6 +1276,7 @@ namespace OpenSim.Framework
{ {
request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10"); request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10");
request.Headers.TryAddWithoutValidation("Connection", "Keep-Alive"); request.Headers.TryAddWithoutValidation("Connection", "Keep-Alive");
request.Headers.ConnectionClose = false;
} }
else else
request.Headers.TryAddWithoutValidation("Connection", "close"); request.Headers.TryAddWithoutValidation("Connection", "close");
@@ -1412,6 +1416,7 @@ namespace OpenSim.Framework
{ {
request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10"); request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10");
request.Headers.TryAddWithoutValidation("Connection", "Keep-Alive"); request.Headers.TryAddWithoutValidation("Connection", "Keep-Alive");
request.Headers.ConnectionClose = false;
} }
//else //else
// request.Headers.TryAddWithoutValidation("Connection", "close"); // request.Headers.TryAddWithoutValidation("Connection", "close");
@@ -1535,6 +1540,7 @@ namespace OpenSim.Framework
{ {
request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10"); request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10");
request.Headers.TryAddWithoutValidation("Connection", "Keep-Alive"); request.Headers.TryAddWithoutValidation("Connection", "Keep-Alive");
request.Headers.ConnectionClose = false;
} }
//else //else
// request.Headers.TryAddWithoutValidation("Connection", "close"); // request.Headers.TryAddWithoutValidation("Connection", "close");

View File

@@ -30,6 +30,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Net; using System.Net;
using System.Net.Http;
using System.Reflection; using System.Reflection;
using Nini.Config; using Nini.Config;
@@ -40,6 +41,7 @@ using OpenSim.Services.Interfaces;
using OpenSim.Server.Base; using OpenSim.Server.Base;
using OpenMetaverse; using OpenMetaverse;
using System.Text; using System.Text;
using System.Threading;
namespace OpenSim.Services.Connectors namespace OpenSim.Services.Connectors
{ {
@@ -747,54 +749,59 @@ namespace OpenSim.Services.Connectors
{ {
if (WebUtil.DebugLevel >= 3) if (WebUtil.DebugLevel >= 3)
m_log.Debug($"[XInventory]: HTTP OUT SynchronousRestForms POST to {m_InventoryURL}"); m_log.Debug($"[XInventory]: HTTP OUT SynchronousRestForms POST to {m_InventoryURL}");
if (string.IsNullOrEmpty(obj))
int tickstart = Util.EnvironmentTickCount();
HttpWebRequest request;
try
{ {
request = (HttpWebRequest)WebRequest.Create(m_InventoryURL); m_log.Warn($"[XInventory]: empty post data");
request.Method = "POST"; return new Dictionary<string, object>();
if (m_requestTimeoutSecs > 0)
request.Timeout = m_requestTimeoutSecs * 1000;
if (m_Auth is not null)
m_Auth.AddAuthorization(request.Headers);
request.AllowWriteStreamBuffering = false;
request.ContentType = "application/x-www-form-urlencoded";
}
catch (Exception e)
{
m_log.Info($"[XInventory]: Error creating POST request to {m_InventoryURL}: {e.Message}");
throw;
}
int sendlen;
try
{
byte[] data = Util.UTF8NBGetbytes(obj);
sendlen = data.Length;
request.ContentLength = sendlen;
using (Stream requestStream = request.GetRequestStream())
requestStream.Write(data, 0, sendlen);
data = null;
}
catch (Exception e)
{
m_log.Info($"[XInventory]: Error sending POST request to {m_InventoryURL}: {e.Message}");
throw;
} }
Dictionary<string, object> respDic = null; Dictionary<string, object> respDic = null;
int ticks = Util.EnvironmentTickCount();
int sendlen = 0;
int rcvlen = 0; int rcvlen = 0;
HttpResponseMessage responseMessage = null;
HttpRequestMessage request = null;
CancellationTokenSource cancellationToken = null;
try try
{ {
using WebResponse resp = request.GetResponse(); HttpClient client = WebUtil.SharedHttpClientWithRedir;
if (resp.ContentLength != 0)
request = new(HttpMethod.Post, m_InventoryURL);
m_Auth?.AddAuthorization(request.Headers);
//if (keepalive)
{ {
rcvlen = (int)resp.ContentLength; request.Headers.TryAddWithoutValidation("Keep-Alive", "timeout=30, max=10");
respDic = ServerUtils.ParseXmlResponse(resp.GetResponseStream()); request.Headers.TryAddWithoutValidation("Connection", "Keep-Alive");
request.Headers.ConnectionClose = false;
}
//else
// request.Headers.TryAddWithoutValidation("Connection", "close");
request.Headers.ExpectContinue = false;
request.Headers.TransferEncodingChunked = false;
if (m_requestTimeoutSecs > 0)
cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(m_requestTimeoutSecs));
byte[] data = Util.UTF8NBGetbytes(obj);
sendlen = data.Length;
request.Content = new ByteArrayContent(data);
request.Content.Headers.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded");
request.Content.Headers.TryAddWithoutValidation("Content-Length", sendlen.ToString());
if (cancellationToken is null)
responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead);
else
responseMessage = client.Send(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken.Token);
responseMessage.EnsureSuccessStatusCode();
if ((responseMessage.Content.Headers.ContentLength is long contentLength) && contentLength != 0)
{
rcvlen = (int)contentLength;
respDic = ServerUtils.ParseXmlResponse(responseMessage.Content.ReadAsStream());
} }
} }
catch (Exception e) catch (Exception e)
@@ -802,11 +809,17 @@ namespace OpenSim.Services.Connectors
m_log.Info($"[XInventory]: Error receiving response from {m_InventoryURL}: {e.Message}"); m_log.Info($"[XInventory]: Error receiving response from {m_InventoryURL}: {e.Message}");
throw; throw;
} }
finally
int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
if (tickdiff > WebUtil.LongCallTime)
{ {
m_log.Info($"[XInventory]: POST {m_InventoryURL} took {tickdiff}ms {sendlen}/{rcvlen}bytes"); request?.Dispose();
responseMessage?.Dispose();
cancellationToken?.Dispose();
}
ticks = Util.EnvironmentTickCountSubtract(ticks);
if (ticks > WebUtil.LongCallTime)
{
m_log.Info($"[XInventory]: POST {m_InventoryURL} took {ticks}ms {sendlen}/{rcvlen}bytes");
} }
return respDic ?? new Dictionary<string, object>(); return respDic ?? new Dictionary<string, object>();