I'm trying a bit of socket stuff. I went back to the htmlget.d sample, and patched it up for 2.0 (I'm using DMD 2.042 on Ubuntu 9.10). I get the same results from this as I do from my own code, which is that writeString() on the SocketStream throws an exception.

From everything I can tell, I don't have an established connection, even though everything claims I have one.

Here is the updated sample code:

/*
        HTMLget written by Christopher E. Miller
        This code is public domain.
        You may use it for any purpose.
        This code has no warranties and is provided 'as-is'.
*/


//debug = HTMLGET;


module htmlget;
import std.string, std.conv, std.stream;
import std.socket, std.socketstream;
import std.stdio;

int main(string[] args)
{
        uint addr;
        if(args.length < 2)
        {
                printf("Usage:\n   htmlget <web-page>\n");
                return 0;
        }
        string url = args[1];
        int i;

        //i = std.string.find(url, "://");
        i=std.string.indexOf(url,"://");
        if(i != -1)
        {
                if(icmp(url[0 .. i], "http"))
                        throw new Exception("http:// expected");
        }

        url = url[i+3 .. url.length];

        //i = std.string.find(url, '#');
        i=std.string.indexOf(url,'#');
        if(i != -1) // Remove anchor ref.
                url = url[0 .. i];

        //i = std.string.find(url, '/');
        i=std.string.indexOf(url,'/');
        string domain;
        if(i == -1)
        {
                domain = url;
                url = "/";
        }
        else
        {
                domain = url[0 .. i];
                url = url[i .. url.length];
        }

        ushort port;
        //i = std.string.find(domain, ':');
        i = std.string.indexOf(domain,':');
        if(i == -1)
        {
                port = 80; // Default HTTP port.
        }
        else
        {
                port=parse!(ushort)(domain[i+1..domain.length]);
                domain = domain[0 .. i];
        }

        writefln("Parsed domain: %s, port: %d and url: %s", domain, port, url);

        addr = InternetAddress.parse(domain);
        debug(HTMLGET)
                writefln("Connecting to %s on port %d...", domain, port);

auto Socket sock = new TcpSocket(new std.socket.InternetAddress(addr/*domain*/, port));
        Stream ss = new SocketStream(sock);

        debug(HTMLGET)
                printf("Connected!\nRequesting URL \"" ~ url ~ "\"...\n");

        if(port != 80)
        {
                char[] temp=cast(char[]) domain;
                temp=temp~cast(char[])":" ~cast(char[]) (to!string(port));
                domain=cast(string)temp;
        }
        ss.writeString("GET " ~ url ~ " HTTP/1.1\r\n"
                "Host: " ~ domain ~ "\r\n"
                "\r\n");

        // Skip HTTP header.
        string line;
        for(;;)
        {
                line = cast(string)ss.readLine();
                if(!line.length)
                        break;

                const string CONTENT_TYPE_NAME = "Content-Type: ";
                if(line.length > CONTENT_TYPE_NAME.length &&
                        !icmp(CONTENT_TYPE_NAME, line[0 .. 
CONTENT_TYPE_NAME.length]))
                {
                        string type;
                        type = line[CONTENT_TYPE_NAME.length .. line.length];
                        if(type.length <= 5 || icmp("text/", type[0 .. 5]))
                                throw new Exception("URL is not text");
                }
        }

        print_lines:
        while(!ss.eof())
        {
                line = cast(string)ss.readLine();
                printf("%.*s\n", line);

                size_t iw;
                for(iw = 0; iw != line.length; iw++)
                {
                        if(!icmp("</html>", line[iw .. line.length]))
                                break print_lines;
                }
        }

        return 0;
}


And here is my invocation, and its response:

$ dmd -run ./htmlget2.d http://10.120.1.106:80/
Parsed domain: 10.120.1.106, port: 80 and url: /
std.stream.WriteException: unable to write to stream
$


Can anyone else duplicate this? Or let me know if I'm doing something wrong in my updating of the sample code?


Reply via email to