1 /**
2 * VFS driver for curl.
3 *
4 * License:
5 * This Source Code Form is subject to the terms of
6 * the Mozilla Public License, v. 2.0. If a copy of
7 * the MPL was not distributed with this file, You
8 * can obtain one at http://mozilla.org/MPL/2.0/.
9 *
10 * Authors:
11 * Vladimir Panteleev <vladimir@thecybershadow.net>
12 */
13
14 module ae.sys.vfs.curl;
15
16 private:
17
18 import ae.sys.vfs;
19
20 import etc.c.curl : CurlOption;
21 import std.net.curl;
22 import std.string;
23
24 class CurlVFS : VFS
25 {
26 override void[] read(string path) { return get!(AutoProtocol, ubyte)(path); }
27 override void write(string path, const(void)[] data) { put!(AutoProtocol, ubyte)(path, cast(ubyte[])data); }
28 override bool exists(string path)
29 {
30 auto proto = path.split("://")[0];
31 if (proto == "http" || proto == "https")
32 {
33 auto http = HTTP(path);
34 http.method = HTTP.Method.head;
35 bool ok = false;
36 http.onReceiveStatusLine = (statusLine) { ok = statusLine.code < 400; };
37 http.perform();
38 return ok;
39 }
40 else
41 {
42 try
43 {
44 read(path);
45 return true;
46 }
47 catch (Exception e)
48 return false;
49 }
50 }
51 override void remove(string path) { del(path); }
52 override void mkdirRecurse(string path) { assert(false, "Operation not supported"); }
53
54 static this()
55 {
56 registry["http"] =
57 registry["https"] =
58 registry["ftp"] =
59 registry["ftps"] =
60 // std.net.curl (artificially) restricts supported protocols to the above
61 //registry["scp"] =
62 //registry["sftp"] =
63 //registry["telnet"] =
64 //registry["ldap"] =
65 //registry["ldaps"] =
66 //registry["dict"] =
67 //registry["file"] =
68 //registry["tftp"] =
69 new CurlVFS();
70 }
71 }
72
73 unittest
74 {
75 if (false)
76 {
77 assert( "http://thecybershadow.net/robots.txt".exists);
78 assert(!"http://thecybershadow.net/nonexistent".exists);
79 }
80 }