Skip to content

Commit d2cca6a

Browse files
committed
Implemented the File requester #11
1 parent 90f769a commit d2cca6a

File tree

6 files changed

+108
-2
lines changed

6 files changed

+108
-2
lines changed

src/AngleSharp.Io.Tests/AngleSharp.Io.Tests.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
</ItemGroup>
9494
<ItemGroup>
9595
<Compile Include="Helper.cs" />
96+
<Compile Include="Network\FileRequesterTests.cs" />
9697
<Compile Include="Network\FtpRequesterTests.cs" />
9798
<Compile Include="Network\HttpClientRequesterTests.cs" />
9899
<Compile Include="Network\Mocks\Request.cs" />
@@ -106,6 +107,9 @@
106107
<None Include="packages.config" />
107108
</ItemGroup>
108109
<ItemGroup>
110+
<Content Include="TestContent.txt">
111+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
112+
</Content>
109113
</ItemGroup>
110114
<Choose>
111115
<When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
namespace AngleSharp.Io.Tests.Network
2+
{
3+
using AngleSharp.Dom.Html;
4+
using AngleSharp.Extensions;
5+
using AngleSharp.Io.Network;
6+
using AngleSharp.Network.Default;
7+
using NUnit.Framework;
8+
using System;
9+
using System.IO;
10+
using System.Reflection;
11+
using System.Threading;
12+
using System.Threading.Tasks;
13+
14+
[TestFixture]
15+
public class FileRequesterTests
16+
{
17+
static String GetLocalPath()
18+
{
19+
var directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
20+
var path = Path.Combine(directory, "TestContent.txt");
21+
var uri = new Uri(path);
22+
return uri.AbsoluteUri;
23+
}
24+
25+
[Test]
26+
public async Task GetLocalFileViaFileRequester()
27+
{
28+
var url = GetLocalPath();
29+
var requester = new FileRequester();
30+
var request = new Request { Address = Url.Create(url) };
31+
32+
var response = await requester.RequestAsync(request, CancellationToken.None);
33+
Assert.IsNotNull(response);
34+
35+
var content = await new StreamReader(response.Content).ReadToEndAsync();
36+
Assert.AreEqual("Foo!", content);
37+
}
38+
39+
[Test]
40+
public async Task FollowLinkToUseFileRequesterUsingAllRequesters()
41+
{
42+
var url = GetLocalPath();
43+
var config = Configuration.Default.WithRequesters();
44+
var context = BrowsingContext.New(config);
45+
var document = await context.OpenAsync(res => res.Content("<a href='" + url + "'>Download</a>"));
46+
var result = await document.QuerySelector<IHtmlAnchorElement>("a").NavigateAsync();
47+
var content = result.Body.TextContent;
48+
Assert.AreEqual("Foo!", content);
49+
}
50+
51+
[Test]
52+
public async Task FollowLinkToUseFileRequesterUsingStandardRequesters()
53+
{
54+
var url = GetLocalPath();
55+
var config = Configuration.Default.WithDefaultLoader();
56+
var context = BrowsingContext.New(config);
57+
var document = await context.OpenAsync(res => res.Content("<a href='" + url + "'>Download</a>"));
58+
var result = await document.QuerySelector<IHtmlAnchorElement>("a").NavigateAsync();
59+
var content = result.Body.TextContent;
60+
Assert.AreEqual(0, content.Length);
61+
}
62+
}
63+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Foo!

src/AngleSharp.Io/AngleSharp.Io.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
<Compile Include="Extensions\GeneralExtensions.cs" />
5353
<Compile Include="Dom\WebSocket.cs" />
5454
<Compile Include="Interfaces\IStorage.cs" />
55+
<Compile Include="Network\FileRequester.cs" />
5556
<Compile Include="Network\FtpRequester.cs" />
5657
<Compile Include="Network\HttpClientRequester.cs" />
5758
<Compile Include="Properties\AssemblyInfo.cs" />

src/AngleSharp.Io/ConfigurationExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public static class ConfigurationExtensions
2020
/// <returns>The new configuration.</returns>
2121
public static IConfiguration WithRequesters(this IConfiguration configuration, Action<LoaderService> setup = null)
2222
{
23-
var requesters = new IRequester[] { new HttpClientRequester(), new DataRequester(), new FtpRequester() };
23+
var requesters = new IRequester[] { new HttpClientRequester(), new DataRequester(), new FtpRequester(), new FileRequester() };
2424
return configuration.WithDefaultLoader(setup, requesters);
2525
}
2626

@@ -36,7 +36,7 @@ public static IConfiguration WithRequesters(this IConfiguration configuration, A
3636
public static IConfiguration WithRequesters(this IConfiguration configuration, HttpMessageHandler httpMessageHandler, Action<LoaderService> setup = null)
3737
{
3838
var httpClient = new HttpClient(httpMessageHandler);
39-
var requesters = new IRequester[] { new HttpClientRequester(httpClient), new DataRequester(), new FtpRequester() };
39+
var requesters = new IRequester[] { new HttpClientRequester(httpClient), new DataRequester(), new FtpRequester(), new FileRequester() };
4040
return configuration.WithDefaultLoader(setup, requesters);
4141
}
4242
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
namespace AngleSharp.Io.Network
2+
{
3+
using AngleSharp.Network;
4+
using AngleSharp.Network.Default;
5+
using System;
6+
using System.Net;
7+
using System.Threading;
8+
using System.Threading.Tasks;
9+
10+
public class FileRequester : IRequester
11+
{
12+
public async Task<IResponse> RequestAsync(IRequest request, CancellationToken cancel)
13+
{
14+
var requester = FileWebRequest.Create(request.Address.Href) as FileWebRequest;
15+
16+
if (requester != null)
17+
{
18+
var response = await requester.GetResponseAsync().ConfigureAwait(false);
19+
var content = response.GetResponseStream();
20+
21+
return new Response
22+
{
23+
Address = request.Address,
24+
Content = content,
25+
StatusCode = HttpStatusCode.OK
26+
};
27+
}
28+
29+
return default(IResponse);
30+
}
31+
32+
public Boolean SupportsProtocol(String protocol)
33+
{
34+
return !String.IsNullOrEmpty(protocol) && protocol.Equals(ProtocolNames.File);
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)