C (Clang, ARMv7-a Linux/Android, AT&T Wireless), 162 bytes
Since we're hardcoding URLs, why not hardcode ISPs?
main(s){int b[500]={5<<28|2,**((int***)gethostbyname("ai"))[4]};connect(s=socket(2,1,0),b,16);write(s,"GET / HTTP/1.0\n\n",16);read(s,b,-1);read(s,b,-1);puts(b);}
I can't show a demo because none of the demos have online enabled :(
This abuses two things. One is that I assume http://ai
is smaller than 2000 bytes and just casually read a max of 4GB onto the stack (what could possibly go wrong), and two is that I take advantage of how I discovered that AT&T Wireless converts \n
to \r\n
in HTTP requests for some reason (new data saving hack?).
Termux screenshot, showing how it works on data (AT&T via Cricket) but not on my Wi-Fi (Xfinity).

Ungolfed and commented:
note: I have removed the punning and buffer reusing for this.
#include <unistd.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <stdint.h>
#include <string.h>
#include <stdio.h>
int main(void)
{
// Look up the IP address of http://ai
// Note that I mess around with type punning and the documented
// layout of the structure in the golfed version.
struct hostent *ent = gethostbyname("ai");
// Extract the first IP address (already in network order)
uint32_t ip;
memcpy(&ip, ent->h_addr_list[0], sizeof(uint32_t));
// Create the sockaddr struct
struct sockaddr_in header = (struct sockaddr_in) {
.sin_family = AF_INET,
.sin_port = htons(80),
.sin_addr = { ip }
};
// Copy over to the pun
struct sockaddr_storage header_raw;
memcpy(&header_raw, &header, sizeof(header));
// Create an IPv4 socket
int soc = socket(AF_INET, SOCK_STREAM, 0);
// Connect the socket to the interwebs
connect(soc, (const struct sockaddr *)&header_raw, sizeof(header_raw));
// Send an HTTP GET request
// Note that because It Works™ on AT&T, I use \n instead of the proper \r\n. Two newlines are still required though.
#ifdef ATT
const char get_request[] = "GET / HTTP/1.0\n\n";
#else
const char get_request[] = "GET / HTTP/1.0\r\n\r\n";
#endif
write(soc, get_request, strlen(get_request));
char buf[2000] = {0};
// Note: I use -1 to just read the entire thing. Hopefully it is all shorter than
// 1999 chars :P
#ifdef BUF_HACK
size_t len = -1;
#else
size_t len = sizeof(buf) - 1;
#endif
// Receive the HTTP response header
read(soc, buf, len);
// But ignore it because I don't care about parsing HTTP stuff
// Just read again for the real data
read(soc, buf, len);
// Print to stdout (assuming the HTTP header was shorter)
puts(buf);
// I don't actually bother closing the socket in the golfed code, sue me.
#ifndef RESOURCE_HOG
close(soc);
#endif
}
I just decided to see how painful this was, I knew before I started that it didn't have a chance. 😏