using System;
using System.Text.RegularExpressions;
using System.IO;
using System.Diagnostics ;
using System.Net;
namespace FSHelperLib
{
using System;
using System.Text;
// System.Web.HttpRequest is a class used on the server and inside an ASP.NET application. It represents the *incoming* request from a client.
// System.Net.HttpWebRequest is a class used to make an *outgoing request to a web application.
///<summary>
/// Summary description for HttpWebRequestHelper.
///</summary>
public class HttpWebRequestHelper
{
// Methods
public HttpWebRequestHelper()
{
}
//only cookies returned, actual response is ignored
public static CookieContainer PostWithCookies(string sUrl, string postData, string saveHtml)
{
// have a cookie container ready to receive the forms auth cookie
CookieContainer cntnrCookies = new CookieContainer();
return PostWithCookies(sUrl, postData, saveHtml, ref cntnrCookies);
}
//only cookies returned, actual response is ignored
public static CookieContainer PostWithCookies(string sUrl,string postData,string saveHtml,ref CookieContainer cntnrCookies)
{
if(cntnrCookies==null)
{
cntnrCookies = new CookieContainer();
}
HttpWebResponse resp=PostGetHttpWebResponse(sUrl, postData,ref cntnrCookies);
DebugHelper.TracedLine(" resp.ResponseURI=" + resp.ResponseUri );
Stream strmResponse = resp.GetResponseStream();
if (!DataHelper.IsNullOrEmpty(saveHtml))
DebugHelper.PrintCookies(new Uri(sUrl),cntnrCookies);
return cntnrCookies;
}
public static HttpWebResponse PostGetHttpWebResponse(string sUrl,string postData,ref CookieContainer cntnrCookies)
{
HttpWebRequest webRequest = PreparePostRequest(sUrl, postData, cntnrCookies);
HttpWebResponse resp=webRequest.GetResponse() as HttpWebResponse;
//from http://www.codeproject.com/csharp/clientticket_msnp9.asp
while((resp.StatusCode == HttpStatusCode.Redirect) )//add? || (resp.StatusCode == HttpStatusCode.Moved ) )
{// If the statuscode is 302, then there is a redirect, read the new adres en connect again
string uri = resp.Headers.Get("Location");
// Make a new request
webRequest = (HttpWebRequest)HttpWebRequest.Create(uri); //get, not post
webRequest.CookieContainer = cntnrCookies;
resp = (HttpWebResponse)webRequest.GetResponse();
}
DebugHelper.PrintHttpWebResponse(resp,TraceHelper.LineWithTrace(""));
DebugHelper.PrintCookies(webRequest.RequestUri,cntnrCookies);
//DebugHelper.PrintCookies(resp.Cookies,"Response.Cookies" );
return resp;
}
private static HttpWebRequest PreparePostRequest(string sUrl, string postData, CookieContainer cntnrCookies)
{
// first, request the login form to get the viewstate value
// now post to the login form
HttpWebRequest webRequest = PrepareWebRequest(sUrl, "POST", cntnrCookies);
// write the form values into the request message
StreamWriter requestWriter = new StreamWriter(webRequest.GetRequestStream());
requestWriter.Write(postData);
requestWriter.Close();
return webRequest;
}
//The Method property can be set to any of the HTTP 1.1 protocol verbs: GET, HEAD, POST, PUT, DELETE, TRACE, or OPTIONS.
public static HttpWebRequest PrepareWebRequest(string sUrl, string Method, CookieContainer cntnrCookies)
{
HttpWebRequest webRequest = WebRequest.Create(sUrl) as HttpWebRequest;
webRequest.Method = Method;
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.CookieContainer = cntnrCookies;
/* //try to change - from http://www.codeproject.com/csharp/ClientTicket_MSNP9.asp
webRequest.AllowAutoRedirect = false;
webRequest.Pipelined = false;
webRequest.KeepAlive = false;
webRequest.ProtocolVersion = new Version(1,0);//protocol 1.0 works better that 1.1 ??
*/
//MNF 26/5/2005 Some web servers expect UserAgent to be specified
//so let's say it's IE6
webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)";
DebugHelper.PrintHttpWebRequest(webRequest, TraceHelper.LineWithTrace(""));
return webRequest;
}
public static string PostGetResponseString(string sUrl, string postData, ref CookieContainer cntnrCookies, string saveHtml)
{
HttpWebResponse resp=PostGetHttpWebResponse(sUrl, postData,ref cntnrCookies);
string sResp = GetResponseString(resp, saveHtml);
return sResp;
}
public static string GetResponseString(string sUrl, string Method, CookieContainer cntnrCookies, string sFileToSaveHtml)
{
HttpWebRequest webRequest = HttpWebRequestHelper.PrepareWebRequest(sUrl, Method, cntnrCookies);
HttpWebResponse resp = webRequest.GetResponse() as HttpWebResponse;
return HttpWebRequestHelper.GetResponseString(resp, sFileToSaveHtml);
}
public static string GetResponseString(HttpWebResponse resp, string saveHtml)
{
string sResp = StreamHelper.StreamToString(resp.GetResponseStream());
resp.Close();
if (!DataHelper.IsNullOrEmpty(saveHtml))
{
StreamHelper.SaveStringToFile(sResp, saveHtml);
}
return sResp;
}
public static bool CookieExists(string sUrl, CookieContainer container, string name)
{
return CookieExists( new Uri( sUrl) , container, name);
}
public static bool CookieExists( Uri uri ,CookieContainer container, string name)
{
if (container==null)
{
return false;
}
System.Net.CookieCollection cookies = container.GetCookies(uri);
return CookieExists(cookies,name );
}
public static bool CookieExists(CookieCollection cookies, string name)
{
return (cookies[name]!=null);
}
public static string ExtractViewState(string sHtml)
string sRet = "";
try
{
String sPattern = @"name=""__VIEWSTATE"".value=""(.*?)""";// name="__VIEWSTATE".value="(.*?)"
//can return empty viewstate
//if (String.IsNullOrEmpty(sRet))
//{
// throw new FSCSharpLib.ExceptionWithDetails("The returned html has unexpected format", "html: " + sHtml);
//}
}
catch (Exception exc)
{
throw new FSCSharpLib.ExceptionWithDetails("The returned html has unexpected format", "html: " + sHtml, exc);
}
//From http://odetocode.com/Articles/162.aspx:
//Notice the use of URL encoding to make sure the server misinterprets no characters with a special meaning (like the equal sign).
return System.Web.HttpUtility.UrlEncodeUnicode(sRet);
}
//Default method is Get, do not store cookies
public static Stream GetResponseStream(string sUrl, IWebProxy proxy)
{
HttpWebRequest webRequest = WebRequest.Create(sUrl) as HttpWebRequest;
// webRequest.ContentType = "application/x-www-form-urlencoded";//is good?
webRequest.Proxy = proxy;
//you can change some properties if required - from http://www.codeproject.com/csharp/ClientTicket_MSNP9.asp
//MNF 26/5/2005 Some web servers expect UserAgent to be specified,so let's say it's IE6
webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)";
DebugHelper.PrintHttpWebRequest(webRequest, TraceHelper.LineWithTrace(""));
HttpWebResponse resp = webRequest.GetResponse() as HttpWebResponse;
Stream strm = resp.GetResponseStream();
return strm;//'HttpWebRequestHelper.GetResponseString(resp, sFileToSaveHtml);
}
}// class HttpWebRequestHelper
}