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 }