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; }
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); }