public string Post(IRetsRequest retsRequest)
{
var methodUri = new Uri(retsRequest.MethodUrl);
var sessionInfo = retsRequest.Session;
var networkCredential = new NetworkCredential(sessionInfo.UserName, sessionInfo.Password);
var authMethod = retsRequest.Session.AuthMethod == AuthenticationMethod.Basic ? "Basic" : "Digest";
var credentials = new CredentialCache {{methodUri, authMethod, networkCredential}};
var request = (HttpWebRequest)WebRequest.Create(methodUri);
request.PreAuthenticate = true;
request.Credentials = credentials;
request.UserAgent = sessionInfo.UserAgent;
request.Headers.Add("RETS-Version", sessionInfo.RetsVersion);
request.Method = "POST";
request.ContentType = "text/xml";
request.CookieContainer = sessionInfo.Cookies ?? new CookieContainer();
if (!string.IsNullOrWhiteSpace(sessionInfo.UserAgentAuth))
request.Headers.Add("RETS-UA-Authorization", GetUserAgentAuthorization(sessionInfo));
foreach (var header in retsRequest.Headers)
request.Headers.Add(header.Key, header.Value);
// Handle Digest calculations here because PreAuthenticate doesn't work properly for digest
if (!string.IsNullOrWhiteSpace(sessionInfo.Authorization))
{
var digestUtility = new DigestUtility();
var newHeader = digestUtility.UpdateAuthorizationHeader(sessionInfo.Authorization, methodUri.AbsolutePath, sessionInfo.Password, request.Method);
if (!string.IsNullOrWhiteSpace(newHeader))
request.Headers.Add("Authorization", newHeader);
}
// Prepare the request after everything has been set up, but before we make the call
// so the request can be modified as needed for the transaction.
// NOTE: Set headers before streaming PostBody data
retsRequest.PrepareRequest(request);
byte[] rawPostData = retsRequest.PostBody;
if (rawPostData != null && rawPostData.Length > 0)
{
request.ContentLength = rawPostData.Length;
using (var requestStream = request.GetRequestStream())
{
requestStream.Write(rawPostData, 0, rawPostData.Length);
requestStream.Close();
}
}
else
{
request.ContentLength = 0;
}
HttpWebResponse response = null;
try
{
response = (HttpWebResponse)request.GetResponse();
// Store the authorization header value for subsequent use
sessionInfo.Authorization = request.Headers.Get("Authorization");
sessionInfo.Cookies = new CookieContainer();
foreach (Cookie cookie in response.Cookies)
sessionInfo.Cookies.Add(cookie);
using (var stream = new StreamReader(response.GetResponseStream()))
{
string result = stream.ReadToEnd();
return result;
}
}
finally
{
if (response != null)
{
response.Close();
}
}
}