Complete BTNv1 and Fix Cloudfare cookies

This commit is contained in:
KZ
2015-09-30 21:21:43 +01:00
parent 53e680ea87
commit 982300ec6e
11 changed files with 220 additions and 110 deletions

View File

@@ -1,5 +1,6 @@
using AutoMapper;
using Jackett.Models;
using Jackett.Services;
using NLog;
using System;
using System.Collections.Generic;
@@ -13,11 +14,13 @@ namespace Jackett.Utils.Clients
{
public class HttpWebClient : IWebClient
{
private Logger logger;
Logger logger;
IConfigurationService configService;
public HttpWebClient(Logger l)
public HttpWebClient(Logger l, IConfigurationService c)
{
logger = l;
configService = c;
}
@@ -41,13 +44,13 @@ namespace Jackett.Utils.Clients
return Mapper.Map<WebClientStringResult>(result);
}
private async Task<WebClientByteResult> Run(WebRequest request)
private async Task<WebClientByteResult> Run(WebRequest webRequest)
{
var cookies = new CookieContainer();
if (!string.IsNullOrEmpty(request.Cookies))
if (!string.IsNullOrEmpty(webRequest.Cookies))
{
var uri = new Uri(request.Url);
foreach (var c in request.Cookies.Split(';'))
var uri = new Uri(webRequest.Url);
foreach (var c in webRequest.Cookies.Split(';'))
{
try
{
@@ -67,27 +70,52 @@ namespace Jackett.Utils.Clients
UseCookies = true,
});
client.DefaultRequestHeaders.Add("User-Agent", BrowserUtil.ChromeUserAgent);
if(webRequest.EmulateBrowser)
client.DefaultRequestHeaders.Add("User-Agent", BrowserUtil.ChromeUserAgent);
else
client.DefaultRequestHeaders.Add("User-Agent", "Jackett/" + configService.GetVersion());
HttpResponseMessage response = null;
var request = new HttpRequestMessage();
request.Headers.ExpectContinue = false;
request.RequestUri = new Uri(webRequest.Url);
if (request.Headers != null)
if (webRequest.Headers != null)
{
foreach (var header in request.Headers)
foreach (var header in webRequest.Headers)
{
client.DefaultRequestHeaders.Add(header.Key, header.Value);
if (header.Key != "Content-Type")
{
request.Headers.Add(header.Key, header.Value);
}
}
}
if (request.Type == RequestType.POST)
if (!string.IsNullOrEmpty(webRequest.RawBody))
{
var content = new FormUrlEncodedContent(request.PostData);
response = await client.PostAsync(request.Url, content);
var type = webRequest.Headers.Where(h => h.Key == "Content-Type").Cast<KeyValuePair<string,string>?>().FirstOrDefault();
if (type.HasValue)
{
var str = new StringContent(webRequest.RawBody);
str.Headers.Remove("Content-Type");
str.Headers.Add("Content-Type", type.Value.Value);
request.Content = str;
}
else
request.Content = new StringContent(webRequest.RawBody);
request.Method = HttpMethod.Post;
}
else if (webRequest.Type == RequestType.POST)
{
request.Content = new FormUrlEncodedContent(webRequest.PostData);
request.Method = HttpMethod.Post;
}
else
{
response = await client.GetAsync(request.Url);
request.Method = HttpMethod.Get;
}
response = await client.SendAsync(request);
var result = new WebClientByteResult();
result.Content = await response.Content.ReadAsByteArrayAsync();
if (response.Headers.Location != null)
@@ -100,18 +128,27 @@ namespace Jackett.Utils.Clients
// Pull it out manually ignoring the expiry date then set it manually
// http://stackoverflow.com/questions/14681144/httpclient-not-storing-cookies-in-cookiecontainer
IEnumerable<string> cookieHeaders;
var responseCookies = new List<Tuple<string, string>>();
if (response.Headers.TryGetValues("set-cookie", out cookieHeaders))
{
var cookieBuilder = new StringBuilder();
foreach (var c in cookieHeaders)
foreach (var value in cookieHeaders)
{
cookieBuilder.AppendFormat("{0} ", c.Substring(0, c.IndexOf(';') + 1));
var nameSplit = value.IndexOf('=');
if (nameSplit > -1)
{
responseCookies.Add(new Tuple<string, string>(value.Substring(0, nameSplit), value.Substring(0, value.IndexOf(';') + 1)));
}
}
result.Cookies = cookieBuilder.ToString().TrimEnd();
var cookieBuilder = new StringBuilder();
foreach (var cookieGroup in responseCookies.GroupBy(c => c.Item1))
{
cookieBuilder.AppendFormat("{0} ", cookieGroup.Last().Item2);
}
result.Cookies = cookieBuilder.ToString().Trim();
}
ServerUtil.ResureRedirectIsFullyQualified(request, result);
ServerUtil.ResureRedirectIsFullyQualified(webRequest, result);
return result;
}
}