Winsock を使用してプログラムで Twitter RSS フィードを取得し、可能な限り実際のブラウザーのように見せようとしています。私は WinINET を使いたくありません。データの取得は機能しているようですが、gzip_decompress は機能していません。http://code.msdn.microsoft.com/windowsdesktop/An-Asynchronous-HTTP-382f98ceの gzip_decompress を使用しています
void gettweet()
{
std::string szHost = "api.twitter.com";
std::string szIP = ResolveDns(szHost);
std::string szUri = "/1/statuses/user_timeline.rss?screen_name=johnlol";
std::string szRequest;
szRequest += "GET " + szUri + " HTTP/1.1\r\n";
szRequest +=
"Accept: text/html, application/xhtml+xml, */*\r\n" \
"Accept-Language: en-US\r\n" \
"User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)\r\n" \
"Accept-Encoding: gzip, deflate\r\n" \
//"Accept-Encoding: text\r\n"
"Connection: Keep-Alive\r\n" \
"Host: " + szHost + "\r\n" \
"\r\n";
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0) {
MessageBox(0,"couldnt create socket.",0,0);
return;
}
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(szIP.c_str());
serveraddr.sin_port = htons(80);
if (connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) != 0) {
MessageBox(0,"couldnt connect.",0,0);
return;
}
if (send(sock, szRequest.c_str(), szRequest.length(), 0) != szRequest.length()) {
MessageBox(0,"couldnt send.",0,0);
return;
}
char buffer[4096];
std::string szBuffer;
while (1)
{
int len = recv(sock,buffer,sizeof(buffer),0);
if (len == 0 || len == SOCKET_ERROR)
break;
for (int i = 0; i <= len; i++)
szBuffer += buffer[i];
ZeroMemory(buffer,sizeof(buffer));
}
if (int pos = szBuffer.find("\r\n\r\n") != std::string::npos) {
szBuffer.erase(0,pos+4);
if (szBuffer.size() <= 10) {
gettweet();
return;
}
FILE *fp; fopen_s(&fp,"test.txt","ab+");fputs(szBuffer.data(),fp);fclose(fp);
if (szBuffer.data()[0] == 0x1F && szBuffer.data()[1] == 0xFFFFFF8B) {// gzip headers
std::string raw_data;
if (!gzip_decompress(szBuffer.c_str(),szBuffer.size(),raw_data))
MessageBox(0,"decompress failed.",0,0);
else
MessageBox(0,raw_data.c_str(),0,0);
//FILE *fp; fopen_s(&fp,"test.txt","ab+");fputs(szBuffer.data(),fp);fclose(fp);
exit(0);
}
}
closesocket(sock);
}