internal Response Send(Request request)
{
var uri = BaseUri + request.GetRelativeUri();
var httpRequest = HttpWebRequest.CreateHttp(uri);
if (request.Headers.Count > 0)
{
httpRequest.Headers = request.Headers;
}
httpRequest.KeepAlive = true;
httpRequest.Proxy = null;
httpRequest.SendChunked = false;
httpRequest.Method = request.HttpMethod.ToString();
httpRequest.UserAgent = ASettings.DriverName + "/" + ASettings.DriverVersion;
if (!string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password))
{
httpRequest.Headers.Add(
"Authorization",
"Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(Username + ":" + Password))
);
}
if (!string.IsNullOrEmpty(request.Body))
{
httpRequest.ContentType = "application/json; charset=utf-8";
var data = Encoding.UTF8.GetBytes(request.Body);
var stream = httpRequest.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Flush();
stream.Close();
stream.Dispose();
}
else
{
httpRequest.ContentLength = 0;
}
var response = new Response();
try
{
using (var httpResponse = (HttpWebResponse)httpRequest.GetResponse())
{
var responseStream = httpResponse.GetResponseStream();
var reader = new StreamReader(responseStream);
response.StatusCode = (int)httpResponse.StatusCode;
response.Headers = httpResponse.Headers;
response.Body = reader.ReadToEnd();
reader.Close();
reader.Dispose();
responseStream.Close();
responseStream.Dispose();
}
response.DeserializeBody();
}
catch (WebException webException)
{
if ((webException.Status == WebExceptionStatus.ProtocolError) &&
(webException.Response != null))
{
using (var exceptionHttpResponse = (HttpWebResponse)webException.Response)
{
response.StatusCode = (int)exceptionHttpResponse.StatusCode;
if (exceptionHttpResponse.Headers.Count > 0)
{
response.Headers = exceptionHttpResponse.Headers;
}
if (exceptionHttpResponse.ContentLength > 0)
{
using (var exceptionResponseStream = exceptionHttpResponse.GetResponseStream())
using (var exceptionReader = new StreamReader(exceptionResponseStream))
{
response.Body = exceptionReader.ReadToEnd();
}
response.DeserializeBody();
}
}
response.Error = new AEerror();
response.Error.StatusCode = response.StatusCode;
response.Error.Number = 0;
response.Error.Message = "Protocol error: " + webException.Message;
response.Error.Exception = webException;
if (response.DataType == DataType.Document)
{
var document = (Dictionary<string, object>)response.Data;
response.Error.StatusCode = document.Int("code");
response.Error.Number = document.Int("errorNum");
response.Error.Message = "ArangoDB error: " + document.String("errorMessage");
}
}
else
{
throw;
}
}
return response;
}