202 lines
6.8 KiB
C++
202 lines
6.8 KiB
C++
#define CHUNK 16384
|
||
//---------------------------------------------------------------------------
|
||
|
||
#include <assert.h>
|
||
#include <vcl.h>
|
||
#pragma hdrstop
|
||
|
||
#include "THTTPdownloader.h"
|
||
#include "TZlib\GZipHelper.h"
|
||
//---------------------------------------------------------------------------
|
||
#pragma package(smart_init)
|
||
#pragma resource "*.dfm"
|
||
THTTPdownloader *HTTPdownloader;
|
||
|
||
//---------------------------------------------------------------------------
|
||
__fastcall THTTPdownloader::THTTPdownloader(TComponent* Owner)
|
||
: TForm(Owner)
|
||
{
|
||
headers = new TList();
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
int __fastcall THTTPdownloader::descargarHTML(char *host, char *request, TStream *out)
|
||
{
|
||
TMemoryStream* in = new TMemoryStream();
|
||
char buffer[4096];
|
||
|
||
int pos,readed;
|
||
int currSize,lastSize;
|
||
|
||
AnsiString line, Location;
|
||
HTTPheaders_list HeaderStruct;
|
||
httpResult->Clear();
|
||
|
||
for (int i = 0; i < headers->Count; i++)
|
||
{
|
||
HeaderStruct = (HTTPheaders_list) headers->Items[i];
|
||
delete HeaderStruct;
|
||
}
|
||
headers->Clear();
|
||
|
||
|
||
TcpClient1->RemoteHost = AnsiString( host );
|
||
TcpClient1->RemotePort = 80;
|
||
TcpClient1->Open();
|
||
|
||
|
||
if ( TcpClient1->Connected )
|
||
{
|
||
statusBar->SelAttributes->Color = clGreen;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Conectado a: ")+AnsiString(host));
|
||
|
||
/* ¿ver que se envia?
|
||
if ( Visible && debug->Checked ) ShowMessage("Cierre esta ventana para continuar");
|
||
*/
|
||
|
||
TcpClient1->SendBuf(request,StrLen(request));
|
||
|
||
|
||
bool R,W,T;
|
||
bool atStart = true;
|
||
bool inHeaders = true;
|
||
|
||
while (TcpClient1->Connected)
|
||
{
|
||
R=TcpClient1->WaitForData(20000);
|
||
if (!TcpClient1->Connected || !R) break;
|
||
|
||
if ( inHeaders )
|
||
line = TcpClient1->Receiveln();
|
||
else {
|
||
readed = TcpClient1->ReceiveBuf(buffer,4096);
|
||
if(readed<=0) break;
|
||
}
|
||
|
||
|
||
if ( atStart )
|
||
{
|
||
atStart = false; //if (!preg_match('/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', line, m)) return false;
|
||
httpResult->SelAttributes->Color = clGreen;
|
||
httpResult->Paragraph->Numbering = nsBullet;
|
||
httpResult->Lines->Add(line);
|
||
if ( line.SubString(1,4)!="HTTP" ) return -1;
|
||
continue;
|
||
}
|
||
|
||
if (inHeaders)
|
||
{
|
||
if ( line.Trim() == "" )
|
||
{
|
||
inHeaders = false;
|
||
continue;
|
||
}
|
||
|
||
pos = line.AnsiPos(":");
|
||
if (pos==0)
|
||
{
|
||
// Skip to the next header
|
||
continue;
|
||
}
|
||
|
||
HeaderStruct = new THTTP_headers;
|
||
HeaderStruct->key = line.SubString(1,pos-1).Trim().LowerCase();
|
||
HeaderStruct->value = line.SubString(pos+1,line.Length()).Trim();
|
||
headers->Add(HeaderStruct);
|
||
|
||
httpResult->SelAttributes->Color = clRed;
|
||
httpResult->Paragraph->Numbering = nsBullet;
|
||
httpResult->Lines->Add(line);
|
||
|
||
continue;
|
||
}
|
||
|
||
in->Write(buffer,readed);
|
||
}
|
||
TcpClient1->Close();
|
||
|
||
statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("Leidos: ")+AnsiString(readed)+"/"+AnsiString(in->Size));
|
||
|
||
bool gziped=false;
|
||
for ( pos=0;pos<headers->Count; pos++ )
|
||
{
|
||
HeaderStruct = (HTTPheaders_list)headers->Items[pos];
|
||
if ( HeaderStruct->key=="content-encoding" )
|
||
{
|
||
gziped= (HeaderStruct->value=="gzip");
|
||
break;
|
||
} else
|
||
if ( HeaderStruct->key=="location" )
|
||
{
|
||
Location = HeaderStruct->value;
|
||
}
|
||
|
||
|
||
}
|
||
|
||
httpResult->Paragraph->Numbering = nsNone;
|
||
if ( gziped )
|
||
{
|
||
in->Position=0;
|
||
CGZIP2A plain((unsigned char *)in->Memory,(int)in->Size);
|
||
out->Write(plain.psz,plain.Length);out->Write("",1);
|
||
httpResult->Lines->Add(plain.psz);
|
||
} else {
|
||
in->Write("",1);in->Position = 0;
|
||
out->Write(in->Memory,in->Size);
|
||
httpResult->Lines->Add((char *)in->Memory);
|
||
}
|
||
|
||
if ( debug->Checked )
|
||
{
|
||
DateSeparator = '-';
|
||
TimeSeparator = ';';
|
||
statusBar->Clear();
|
||
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add("RX: ------------------------------------------------------------------");
|
||
statusBar->Lines->Assign(httpResult->Lines);
|
||
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add("TX: ------------------------------------------------------------------");
|
||
statusBar->Lines->Add(request);
|
||
statusBar->Lines->SaveToFile( ExtractFilePath(Application->ExeName)+"log\\"+DateTimeToStr(Now())+".http.rtf" );
|
||
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add("EOT ------------------------------------------------------------------");
|
||
}
|
||
|
||
delete in;
|
||
} else {
|
||
statusBar->SelAttributes->Color = clRed;statusBar->Lines->Add(AnsiString(Now())+AnsiString(" > ")+AnsiString("ERROR CONECTANDO a: ")+AnsiString(host));
|
||
return -1;
|
||
}
|
||
|
||
if ( !Location.IsEmpty() ) {
|
||
AnsiString lrequest;
|
||
lrequest = "GET "+Location;
|
||
lrequest+=" HTTP/1.1\r\n";
|
||
lrequest+= "Host: "+AnsiString(host)+"\r\n";
|
||
lrequest+= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
|
||
lrequest+= "Accept-Language: es-es,es;q=0.8\r\n";
|
||
lrequest+= "Accept-Encoding: gzip,deflate\r\n";
|
||
lrequest+= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
|
||
lrequest+= "Keep-Alive: 300\r\n";
|
||
lrequest+= "Connection: keep-alive\r\n";
|
||
lrequest+= "\r\n";
|
||
|
||
return descargarHTML(host, lrequest.c_str(), out);
|
||
} else
|
||
return 0;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
void __fastcall THTTPdownloader::FormDestroy(TObject *Sender)
|
||
{
|
||
HTTPheaders_list HeaderStruct;
|
||
|
||
// Clean up – must free memory for the items as well as the list
|
||
for (int i = 0; i < headers->Count; i++)
|
||
{
|
||
HeaderStruct = (HTTPheaders_list) headers->Items[i];
|
||
delete HeaderStruct;
|
||
}
|
||
delete headers;
|
||
}
|
||
//---------------------------------------------------------------------------
|
||
|
||
|
||
|
||
|