Created
May 17, 2012 18:25
-
-
Save abombss/2720757 to your computer and use it in GitHub Desktop.
Cloning Web/HttpRequests in .Net
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static class WebRequestExtensions | |
{ | |
public static HttpWebRequest CloneRequest(this HttpWebRequest originalRequest, Uri newUri) | |
{ | |
return CloneHttpWebRequest(originalRequest, newUri); | |
} | |
public static WebRequest CloneRequest(this WebRequest originalRequest, Uri newUri) | |
{ | |
var httpWebRequest = originalRequest as HttpWebRequest; | |
if (httpWebRequest != null) return CloneHttpWebRequest(httpWebRequest, newUri); | |
return CloneWebRequest(originalRequest, newUri); | |
} | |
private static HttpWebRequest CloneHttpWebRequest(HttpWebRequest old, Uri newUri) | |
{ | |
var @new = (HttpWebRequest) WebRequest.Create(newUri); | |
CopyWebRequestProperties(old, @new); | |
CopyHttpWebRequestProperties(old, @new); | |
CopyHttpWebRequestHeaders(old, @new); | |
return @new; | |
} | |
private static WebRequest CloneWebRequest(WebRequest old, Uri newUri) | |
{ | |
var @new = WebRequest.Create(newUri); | |
CopyWebRequestProperties(old, @new); | |
CopyWebRequestHeaders(old, @new); | |
return @new; | |
} | |
private static void CopyWebRequestProperties(WebRequest old, WebRequest @new) | |
{ | |
@new.AuthenticationLevel = old.AuthenticationLevel; | |
@new.CachePolicy = old.CachePolicy; | |
@new.ConnectionGroupName = old.ConnectionGroupName; | |
@new.ContentType = old.ContentType; | |
@new.Credentials = old.Credentials; | |
@new.ImpersonationLevel = old.ImpersonationLevel; | |
@new.Method = old.Method; | |
@new.PreAuthenticate = old.PreAuthenticate; | |
@new.Proxy = old.Proxy; | |
@new.Timeout = old.Timeout; | |
@new.UseDefaultCredentials = old.UseDefaultCredentials; | |
if (old.ContentLength > 0) @new.ContentLength = old.ContentLength; | |
} | |
private static void CopyWebRequestHeaders(WebRequest old, WebRequest @new) | |
{ | |
string[] allKeys = old.Headers.AllKeys; | |
foreach (var key in allKeys) | |
{ | |
@new.Headers[key] = old.Headers[key]; | |
} | |
} | |
private static void CopyHttpWebRequestProperties(HttpWebRequest old, HttpWebRequest @new) | |
{ | |
@new.Accept = old.Accept; | |
@new.AllowAutoRedirect = old.AllowAutoRedirect; | |
@new.AllowWriteStreamBuffering = old.AllowWriteStreamBuffering; | |
@new.AutomaticDecompression = old.AutomaticDecompression; | |
@new.ClientCertificates = old.ClientCertificates; | |
@new.SendChunked = old.SendChunked; | |
@new.TransferEncoding = old.TransferEncoding; | |
@new.Connection = old.Connection; | |
@new.ContentType = old.ContentType; | |
@new.ContinueDelegate = old.ContinueDelegate; | |
@new.CookieContainer = old.CookieContainer; | |
@new.Date = old.Date; | |
@new.Expect = old.Expect; | |
@new.Host = old.Host; | |
@new.IfModifiedSince = old.IfModifiedSince; | |
@new.KeepAlive = old.KeepAlive; | |
@new.MaximumAutomaticRedirections = old.MaximumAutomaticRedirections; | |
@new.MaximumResponseHeadersLength = old.MaximumResponseHeadersLength; | |
@new.MediaType = old.MediaType; | |
@new.Pipelined = old.Pipelined; | |
@new.ProtocolVersion = old.ProtocolVersion; | |
@new.ReadWriteTimeout = old.ReadWriteTimeout; | |
@new.Referer = old.Referer; | |
@new.Timeout = old.Timeout; | |
@new.UnsafeAuthenticatedConnectionSharing = old.UnsafeAuthenticatedConnectionSharing; | |
@new.UserAgent = old.UserAgent; | |
} | |
private static void CopyHttpWebRequestHeaders(HttpWebRequest old, HttpWebRequest @new) | |
{ | |
var allKeys = old.Headers.AllKeys; | |
foreach (var key in allKeys) | |
{ | |
switch (key.ToLower(CultureInfo.InvariantCulture)) | |
{ | |
// Skip all these reserved headers because we have to set them through properties | |
case "accept": | |
case "connection": | |
case "content-length": | |
case "content-type": | |
case "date": | |
case "expect": | |
case "host": | |
case "if-modified-since": | |
case "range": | |
case "referer": | |
case "transfer-encoding": | |
case "user-agent": | |
case "proxy-connection": | |
break; | |
default: | |
@new.Headers[key] = old.Headers[key]; | |
break; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
and where is the stream copy?