first commit (2005-12-25)

This commit is contained in:
2021-09-01 18:26:41 +02:00
commit a86196a6a9
439 changed files with 402271 additions and 0 deletions

201
scr/THTTPdownloader.cpp Normal file
View File

@ -0,0 +1,201 @@
#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));
/* <20>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 <20> 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;
}
//---------------------------------------------------------------------------