1 /**
2  * ae.sys.net implementation using ae.net
3  * Note: ae.net requires an SSL provider for HTTPS links.
4  *
5  * License:
6  *   This Source Code Form is subject to the terms of
7  *   the Mozilla Public License, v. 2.0. If a copy of
8  *   the MPL was not distributed with this file, You
9  *   can obtain one at http://mozilla.org/MPL/2.0/.
10  *
11  * Authors:
12  *   Vladimir Panteleev <vladimir@thecybershadow.net>
13  */
14 
15 module ae.sys.net.ae;
16 
17 import ae.net.asockets;
18 import ae.net.http.client;
19 import ae.net.ietf.url;
20 import ae.sys.net;
21 
22 class AENetwork : Network
23 {
24 	private Data getData(string url)
25 	{
26 		Data result;
27 		bool got;
28 
29 		httpGet(url,
30 			(Data data) { result = data; got = true; },
31 			(string error) { throw new Exception(error); }
32 		);
33 
34 		socketManager.loop();
35 		assert(got);
36 		return result;
37 	}
38 
39 	override void downloadFile(string url, string target)
40 	{
41 		Data data = getData(url);
42 		std.file.write(target, data.contents);
43 	}
44 
45 	override void[] getFile(string url)
46 	{
47 		return getData(url).toHeap;
48 	}
49 
50 	override bool urlOK(string url)
51 	{
52 		bool got, result;
53 
54 		auto request = new HttpRequest;
55 		request.method = "HEAD";
56 		request.resource = url;
57 		try
58 		{
59 			httpRequest(request,
60 				(HttpResponse response, string disconnectReason)
61 				{
62 					got = true;
63 					if (!response)
64 						result = false;
65 					else
66 						result = response.status == HttpStatusCode.OK;
67 				}
68 			);
69 
70 			socketManager.loop();
71 		}
72 		catch (Exception e)
73 			return false;
74 
75 		assert(got);
76 		return result;
77 	}
78 
79 	override string resolveRedirect(string url)
80 	{
81 		string result; bool got;
82 
83 		auto request = new HttpRequest;
84 		request.method = "HEAD";
85 		request.resource = url;
86 		httpRequest(request,
87 			(HttpResponse response, string disconnectReason)
88 			{
89 				if (!response)
90 					throw new Exception(disconnectReason);
91 				else
92 				{
93 					got = true;
94 					result = response.headers.get("Location", null);
95 					if (result)
96 						result = url.applyRelativeURL(result);
97 				}
98 			}
99 		);
100 
101 		socketManager.loop();
102 		assert(got);
103 		return result;
104 	}
105 }
106 
107 static this()
108 {
109 	net = new AENetwork();
110 }