mirror of
https://github.com/nheiniger/SnaffPoint
synced 2026-06-08 16:23:31 +00:00
207 lines
8.7 KiB
C#
207 lines
8.7 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Net;
|
|
using System.Text;
|
|
using SearchQueryTool.Model;
|
|
using System.Security;
|
|
|
|
namespace SearchQueryTool.Helpers
|
|
{
|
|
public class HttpRequestRunner
|
|
{
|
|
public static HttpRequestResponsePair RunWebRequest(SearchRequest searchRequest)
|
|
{
|
|
if (searchRequest.HttpMethodType == HttpMethodType.Get)
|
|
{
|
|
return RunGetWebRequest(searchRequest);
|
|
}
|
|
else // POST
|
|
{
|
|
return RunPostWebRequest(searchRequest);
|
|
}
|
|
}
|
|
|
|
private static HttpRequestResponsePair RunGetWebRequest(SearchRequest searchRequest)
|
|
{
|
|
var request = CreateWebRequest(searchRequest.GenerateHttpGetUri(),
|
|
searchRequest.AcceptType,
|
|
searchRequest.Timeout.HasValue? searchRequest.Timeout.Value : SearchRequest.DefaultTimeout,
|
|
searchRequest.AuthenticationType,
|
|
searchRequest.SharePointSiteUrl,
|
|
searchRequest.UserName,
|
|
searchRequest.Password,
|
|
searchRequest.SecurePassword,
|
|
searchRequest.Cookies,
|
|
searchRequest.Token);
|
|
|
|
HttpWebResponse response = null;
|
|
|
|
try
|
|
{
|
|
response = request.GetResponse() as HttpWebResponse;
|
|
}
|
|
catch (WebException webEx)
|
|
{
|
|
if (webEx.Response == null)
|
|
throw;
|
|
|
|
response = webEx.Response as HttpWebResponse;
|
|
}
|
|
|
|
return new HttpRequestResponsePair(request, response);
|
|
}
|
|
|
|
private static HttpRequestResponsePair RunPostWebRequest(SearchRequest searchRequest)
|
|
{
|
|
string xrequestDigestValue = GetXRequestDigestForPostRequest(searchRequest);
|
|
|
|
var request = CreateWebRequest(searchRequest.GenerateHttpPostUri(),
|
|
searchRequest.AcceptType,
|
|
searchRequest.Timeout.HasValue ? searchRequest.Timeout.Value : SearchRequest.DefaultTimeout,
|
|
searchRequest.AuthenticationType,
|
|
searchRequest.SharePointSiteUrl,
|
|
searchRequest.UserName,
|
|
searchRequest.Password,
|
|
searchRequest.SecurePassword,
|
|
searchRequest.Cookies,
|
|
searchRequest.Token);
|
|
|
|
request.Method = "POST";
|
|
request.ContentType = "application/json;odata=verbose;charset=utf-8";
|
|
request.Headers["x-requestdigest"] = xrequestDigestValue;
|
|
|
|
string payload = searchRequest.GenerateHttpPostBodyPayload();
|
|
|
|
if (!String.IsNullOrEmpty(payload))
|
|
{
|
|
byte[] bytes = Encoding.UTF8.GetBytes(payload);
|
|
request.ContentLength = (long)bytes.Length;
|
|
Stream requestStream = request.GetRequestStream();
|
|
requestStream.Write(bytes, 0, bytes.Length);
|
|
requestStream.Close();
|
|
}
|
|
|
|
HttpWebResponse response = null;
|
|
|
|
try
|
|
{
|
|
response = request.GetResponse() as HttpWebResponse;
|
|
}
|
|
catch (WebException webEx)
|
|
{
|
|
response = webEx.Response as HttpWebResponse;
|
|
}
|
|
|
|
return new HttpRequestResponsePair(request, response, payload);
|
|
}
|
|
|
|
private static string GetXRequestDigestForPostRequest(SearchRequest searchRequest)
|
|
{
|
|
string digestValue = "";
|
|
|
|
var request = CreateWebRequest(searchRequest.GenerateHttpPostUri(),
|
|
searchRequest.AcceptType,
|
|
searchRequest.Timeout.HasValue ? searchRequest.Timeout.Value : SearchRequest.DefaultTimeout,
|
|
searchRequest.AuthenticationType,
|
|
searchRequest.SharePointSiteUrl,
|
|
searchRequest.UserName,
|
|
searchRequest.Password,
|
|
searchRequest.SecurePassword,
|
|
searchRequest.Cookies,
|
|
searchRequest.Token);
|
|
|
|
request.Method = "POST";
|
|
request.ContentType = "application/json;odata=verbose;charset=utf-8";
|
|
request.ContentLength = 0;
|
|
|
|
try
|
|
{
|
|
using (var response = (request as HttpWebRequest).GetResponse() as HttpWebResponse)
|
|
{
|
|
foreach (var header in response.Headers.AllKeys)
|
|
{
|
|
if (header.ToLower() == "x-requestdigest")
|
|
{
|
|
digestValue = response.Headers[header];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (WebException webex) // expected 403 Forbidden
|
|
{
|
|
using (WebResponse response = webex.Response)
|
|
{
|
|
HttpWebResponse httpResponse = response as HttpWebResponse;
|
|
|
|
if (httpResponse != null && httpResponse.StatusCode == HttpStatusCode.Forbidden)
|
|
{
|
|
foreach (var header in response.Headers.AllKeys)
|
|
{
|
|
if (header.ToLower() == "x-requestdigest")
|
|
{
|
|
digestValue = response.Headers[header];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return digestValue;
|
|
}
|
|
|
|
private static HttpWebRequest CreateWebRequest(string uri, AcceptType acceptType,
|
|
int timeout = SearchRequest.DefaultTimeout,
|
|
AuthenticationType authType = AuthenticationType.CurrentUser,
|
|
string sharePointSiteUrl = null,
|
|
string username = null,
|
|
string password = null,
|
|
SecureString securePassword = null,
|
|
CookieCollection authCookies = null,
|
|
string accessToken = null)
|
|
{
|
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
|
|
|
|
request.Accept = acceptType == AcceptType.Json ? "application/json;odata=verbose;charset=utf-8" : "application/xml;charset=utf-8";
|
|
|
|
request.Timeout = timeout * 1000;
|
|
request.AllowAutoRedirect = true;
|
|
|
|
if (authType == AuthenticationType.CurrentUser)
|
|
{
|
|
request.ApplyDefaultCredentials();
|
|
}
|
|
else if (authType == AuthenticationType.Windows)
|
|
{
|
|
if (String.IsNullOrWhiteSpace(username))
|
|
throw new ArgumentException("Parameter Username cannot be empty!");
|
|
|
|
if (String.IsNullOrWhiteSpace(password) && securePassword == null)
|
|
throw new ArgumentException("Parameter Password cannot be empty!");
|
|
|
|
request.ApplyWindowsCredentials(username, securePassword);
|
|
}
|
|
else if (authType == AuthenticationType.Forms)
|
|
{
|
|
if (String.IsNullOrWhiteSpace(username))
|
|
throw new ArgumentException("Parameter Username cannot be empty!");
|
|
|
|
if (String.IsNullOrWhiteSpace(password))
|
|
throw new ArgumentException("Parameter Password cannot be empty!");
|
|
|
|
request.ApplyFormsCredentials(sharePointSiteUrl, username, password);
|
|
}
|
|
else if (authType == AuthenticationType.SPO)
|
|
{
|
|
request.ApplyCookieCredentials(authCookies);
|
|
}
|
|
else if (authType == AuthenticationType.SPOManagement)
|
|
{
|
|
request.Headers.Add("Authorization", accessToken);
|
|
}
|
|
return request;
|
|
}
|
|
}
|
|
}
|