Send HTTP request manually via socket
Two things:
- You should use
println
instead ofprint
to print your entries to separate lines. - HTTP request should end in a blank line (link). So add
pw.println("");
The correct fix which really works and it is cross platform:
pw.print("GET / HTTP/1.1\r\n");
pw.print("Host: stackoverflow.com\r\n\r\n");
You don't follow the HTTP RFC.
- Header lines are always ended by a CR LF (i.e.
0x0d
plus0x0a
). - The header ends after the first double-newline. In your case, you don't include the trailing newline so the server doesn't recognize the end of the request headers.
Generally, you should always try to use existing HTTP libraries. Although HTTP seems to be a simple protocol (and it is compared to others), it has rather strict syntactic and semantic rules. If you try to implement this yourself, you should have read and understand the relevant parts of RFC 2616 (and related).
Sadly, there are already too many crappy HTTP implementations not following the standards out there making the life for everyone miserable. Save yourself the hassle and use the HTTP libraries of your chosen language.
The following fix, as mentioned by the previous answers, solves the problem;
pw.print("GET / HTTP/1.1\n\r\n");
pw.print("Host: stackoverflow.com\n\r\n");