Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 8304 → Rev 8305

/programs/cmm/lib/obj/http.h
72,4 → 72,177
};
 
 
#define URL_SIZE 4000
//===================================================//
// //
// HTTP //
// //
//===================================================//
 
struct _http
{
dword cur_url;
dword transfer;
dword content_length;
dword content_received;
dword status_code;
dword receive_result;
dword content_pointer;
 
dword get();
bool stop();
void hfree();
void receive();
dword header_field();
};
 
dword _http::get(dword _url)
{
cur_url = _url;
http_get stdcall (_url, 0, 0, #accept_language);
transfer = EAX;
return transfer;
}
 
void _http::hfree()
{
http_free stdcall (transfer);
transfer=0;
}
 
bool _http::stop()
{
if (transfer)
{
EAX = transfer;
EAX = EAX.http_msg.content_ptr; // get pointer to data
$push EAX // save it on the stack
http_free stdcall (transfer); // abort connection
$pop EAX
free(EAX); // free data
transfer=0;
return true;
}
return false;
}
 
void _http::receive()
{
http_receive stdcall (transfer);
receive_result = EAX;
 
EDI = transfer;
if (!EAX) {
status_code = EDI.http_msg.status;
content_pointer = EDI.http_msg.content_ptr;
}
content_length = EDI.http_msg.content_length;
content_received = EDI.http_msg.content_received;
}
 
:dword _http::header_field(dword _header_field, _dst, _size)
{
http_find_header_field stdcall (transfer, _header_field);
if (EAX!=0) {
ESI = EAX;
EDI = _dst;
EDX = _size;
do {
$lodsb;
$stosb;
$dec edx
} while (AL != 0) && (AL != 13) && (AL != 10) && (EDX>0);
DSBYTE[EDI-1]='\0';
debugln(_dst);
return _dst;
}
return NULL;
}
 
 
//===================================================//
// //
// CHECK PATH TYPE //
// //
//===================================================//
 
:int check_is_the_adress_local(dword _in)
{
if (ESBYTE[_in]!='/') return false;
_in++;
if(!strncmp(_in,"rd/",3)) return true;
if(!strncmp(_in,"fd/",3)) return true;
if(!strncmp(_in,"hd",2)) return true;
if(!strncmp(_in,"bd",2)) return true;
if(!strncmp(_in,"cd",2)) return true;
if(!strncmp(_in,"sys/",4)) return true;
if(!strncmp(_in,"tmp",3)) return true;
if(!strncmp(_in,"usbhd",5)) return true;
if(!strncmp(_in,"kolibrios",9)) return true;
return false;
}
 
:int check_is_the_url_absolute(dword _in)
{
if(!strncmp(_in,"ftp:",4)) return true;
if(!strncmp(_in,"http:",5)) return true;
if(!strncmp(_in,"https:",6)) return true;
if(!strncmp(_in,"mailto:",7)) return true;
if(!strncmp(_in,"tel:",4)) return true;
if(!strncmp(_in,"#",1)) return true;
if(!strncmp(_in,"WebView:",8)) return true;
if(check_is_the_adress_local(_in)) return true;
return false;
}
 
:dword get_absolute_url(dword new_URL, base_URL)
{
int i;
dword orig_URL = new_URL;
char newurl[URL_SIZE+1];
strcpy(#newurl, base_URL);
 
while (i=strstr(new_URL, "&")) strcpy(i+1, i+5);
 
if (check_is_the_url_absolute(new_URL)) return orig_URL;
 
IF (!strncmp(new_URL,"//", 2))
{
strcpy(#newurl, "http:");
strcat(#newurl, new_URL);
strcpy(orig_URL, #newurl);
return orig_URL;
}
IF (!strncmp(new_URL,"./", 2)) new_URL+=2;
 
if (ESBYTE[new_URL] == '/') //remove everything after site domain name
{
i = strchr(#newurl+8, '/');
if (i) ESBYTE[i]=0;
new_URL+=1;
}
_CUT_ST_LEVEL_MARK:
if (newurl[strrchr(#newurl, '/')-2]<>'/')
{
newurl[strrchr(#newurl, '/')] = 0x00;
}
IF (!strncmp(new_URL,"../",3))
{
new_URL+=3;
newurl[strrchr(#newurl, '/')-1] = 0x00;
goto _CUT_ST_LEVEL_MARK;
}
if (newurl[strlen(#newurl)-1]<>'/') strcat(#newurl, "/");
strcat(#newurl, new_URL);
strcpy(orig_URL, #newurl);
return orig_URL;
}
 
 
#endif