import std.file; import std.string; import std.stdio; import std.stream; import std.socketstream; import std.socket; class HttpDownload { public: this() {} void downloadFile(char[] domain, char[] dir, char[] file, int port = 80) { Socket sock = new TcpSocket(new InternetAddress(domain, port)); SocketStream ss = new SocketStream(sock); // we prepare the request if ( port != 80 ) domain = domain ~ ":" ~ cast(char)port; char[] request = "GET " ~ dir ~ "/" ~ file ~ " HTTP/1.1\r\n" ~ "Connection: Keep-Alive\r\n" ~ "User-Agent: Mozilla 5.0\r\n" ~ "Host: " ~ domain ~ "\r\n" ~ "\r\n"; // we send the request ss.writeString(request); // this for removes the HTTP header and looks for a positive response // from the webserver for(;;) { char[] response = ss.readLine(); char[] RESPONSE = "HTTP/1.1 "; if(!response.length) { break; } else { if (response.length > RESPONSE.length && !icmp(RESPONSE, response[0 .. RESPONSE.length])) { char[] code; code = response[RESPONSE.length .. response.length]; int i = ifind(code, "200 OK"); if ( i != -1 ) { writefln("---> Received a 200 OK"); } else { throw new Exception("Webserver has replied with an error"); return; } } } } // write file BufferedFile s = new BufferedFile(); s.create(getcwd() ~ "/" ~ file); ubyte[1] b; while(ss.read(b) != 0){ s.write(b); } ss.close(); s.close(); } } int main() { HttpDownload download = new HttpDownload(); download.downloadFile("www.capponcino.it", "/tremulous/dl/pk3", "highrise-b4.pk3", 80); return 0; }