Skip to content

Commit

Permalink
HttpRequest.AddHeader() also affects on redirected requests when Http…
Browse files Browse the repository at this point in the history
…Request.KeepTemporaryHeadersOnRedirect = true.

Update README.md:
Added new property HttpRequest.KeepTemporaryHeadersOnRedirect (default true).
  • Loading branch information
grandsilence committed Mar 7, 2019
1 parent 74c73b6 commit f5e1448
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 4 deletions.
33 changes: 33 additions & 0 deletions Leaf.xNet.Tests/~Http/HttpRequestTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,39 @@ public void FilterCookieDomains()
}

/*
[TestMethod]
public void KeepTempHeadersAfterRedirect()
{
using (var req = new HttpRequest())
{
req.Proxy = HttpProxyClient.Parse("127.0.0.1:8887");
req.Proxy.AbsoluteUriInStartingLine = false;
req.KeepTemporaryHeadersOnRedirect = true;
req.AddHeader(HttpHeader.Referer, "https://google.com");
var res = req.Get("http://google.com");
var res3 = req.Get("http://ya.ru");
req.KeepTemporaryHeadersOnRedirect = false;
req.AddHeader(HttpHeader.Referer, "https://google.com");
var resNo = req.Get("http://google.com");
req.KeepTemporaryHeadersOnRedirect = true;
req.AddHeader(HttpHeader.Referer, "https://google.com");
req.Get("http://google.com").None();
req.KeepTemporaryHeadersOnRedirect = false;
req.AddHeader(HttpHeader.Referer, "https://google.com");
req.Get("http://google.com").None();
}
}
[TestMethod]
public void AvoidCrossdomainCookieDuplication()
{
Expand Down
16 changes: 12 additions & 4 deletions Leaf.xNet/~Http/HttpRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,11 @@ public event EventHandler<DownloadProgressChangedEventArgs> DownloadProgressChan
/// </summary>
public bool AllowEmptyHeaderValues { get; set; }

/// <summary>
/// Следует ли отправлять временные заголовки (добавленные через <see cref="AddHeader(string,string)"/>) переадресованным запросам.
/// По умолчанию <see langword="true"/>.
/// </summary>
public bool KeepTemporaryHeadersOnRedirect { get; set; } = true;

/// <summary>
/// Включить отслеживание заголовков в промежуточных запросах (переадресованные) и сохранять их в <see cref="HttpResponse.MiddleHeaders"/>.
Expand Down Expand Up @@ -1327,7 +1332,7 @@ public HttpResponse Raw(HttpMethod method, Uri address, HttpContent content = nu
{
content?.Dispose();

ClearRequestData();
ClearRequestData(false);
}
}

Expand Down Expand Up @@ -1670,7 +1675,8 @@ private HttpResponse Request(HttpMethod method, Uri address, HttpContent content
if (Response.HasExternalRedirect)
return Response;

ClearRequestData();
ClearRequestData(true);

method = HttpMethod.GET;
address = Response.RedirectAddress;
content = null;
Expand Down Expand Up @@ -2207,12 +2213,14 @@ private void ReportBytesReceived(int bytesReceived)
}
}

private void ClearRequestData()
private void ClearRequestData(bool redirect)
{
_content = null;

_temporaryMultipartContent = null;
_temporaryHeaders = null;

if (!redirect || !KeepTemporaryHeadersOnRedirect)
_temporaryHeaders = null;
}

private HttpException NewHttpException(string message,
Expand Down
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,15 @@ var resp = httpRequest.Get("https://...");
bool isCloudFlared = resp.isCloudFlared();
```

### Keep temporary headers (when redirected)
It's enabled by default. But you can disable this behavior:
```csharp
httpRequest.KeepTemporaryHeadersOnRedirect = false;
httpRequest.AddHeader(HttpHeader.Referer, "https://google.com");
httpRequest.Get("http://google.com").None();
// After redirection to www.google.com - request won't have Referer header because KeepTemporaryHeadersOnRedirect = false
```

### Middle response headers (when redirected)
```csharp
httpRequest.EnableMiddleHeaders = true;
Expand Down

0 comments on commit f5e1448

Please sign in to comment.