WebView 1.8:

1. possibility to open HTTPS sites via gate.aspero.pro (invisible for user), not working for files
2. rewrite parse tag function to fix broken URLs on page in some cases ("/user" instead of "/user/")
3. fix hand cursor appearance, fix progress bar on page load
4. load homepage on submitting empty url in adressbox
5. F12 - debug on, F11 - old tag parser on
6. unify page/file downloading code

git-svn-id: svn://kolibrios.org@7282 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Kirill Lipatov (Leency) 2018-05-20 13:40:58 +00:00
parent e59b0f053b
commit 873fc290d5
8 changed files with 180 additions and 144 deletions

View File

@ -1,24 +1,4 @@
int UrlIsAbsolute(dword in)
{
if(!strncmp(in,"http:",5)) return true;
if(!strncmp(in,"https:",6)) return true;
if(!strncmp(in,"file:",5)) return true;
if(!strncmp(in,"mailto:",7)) return true;
if(!strncmp(in,"ftp:",4)) return true;
if(!strncmp(in,"WebView:",8)) return true;
if(!strncmp(in,"/sys/",5)) return true;
if(!strncmp(in,"/hd/",4)) return true;
if(!strncmp(in,"/fd/",4)) return true;
if(!strncmp(in,"/rd/",4)) return true;
if(!strncmp(in,"/tmp/",5)) return true;
if(!strncmp(in,"/cd/",4)) return true;
if(!strncmp(in,"/bd/",4)) return true;
if(!strncmp(in,"/usbhd/",7)) return true;
if(!strncmp(in,"/kolibrios/",11)) return true;
return false;
}
void GetAbsoluteURL(dword in_URL) void GetAbsoluteURL(dword in_URL)
{ {
int i; int i;
@ -30,7 +10,7 @@ void GetAbsoluteURL(dword in_URL)
strcpy(i+1, i+5); strcpy(i+1, i+5);
} }
if (UrlIsAbsolute(in_URL)) return; if (check_is_the_url_absolute(in_URL)) return;
IF (!strcmpn(in_URL,"//", 2)) IF (!strcmpn(in_URL,"//", 2))
{ {

View File

@ -88,6 +88,7 @@ bool LinksArray::HoverAndProceed(dword mx, my)
return false; return false;
} }
if (active==i) return false; if (active==i) return false;
CursorPointer.Load(#CursorFile);
CursorPointer.Set(); CursorPointer.Set();
if (links[active].underline) DrawBar(links[active].x, -WB1.list.first + links[active].y if (links[active].underline) DrawBar(links[active].x, -WB1.list.first + links[active].y
+ links[active].h, links[active].w, links[active].underline_h, link_color_inactive); + links[active].h, links[active].w, links[active].underline_h, link_color_inactive);

View File

@ -1,4 +1,81 @@
unsigned int GetNextParam() bool GetNextParam() {
if (!old_tag_parser_mode)
return GetNextParam_NEW();
else
return GetNextParam_OLD();
}
bool GetNextParam_NEW()
{
byte quotes = NULL;
int i;
if (!tagparam) return false;
if (debug_mode) {
debug("tagparam: "); debugln(#tagparam);
}
i = strlen(#tagparam) - 1;
if (tagparam[i] == '/') i--;
while (i>0) && (__isWhite(tagparam[i])) i--;
if (tagparam[i] == '"') || (tagparam[i] == '\'')
{
//find VAL end
quotes = tagparam[i];
tagparam[i] = '\0'; i--;
//find VAL start and copy
i = strrchr(#tagparam, quotes);
strlcpy(#val, #tagparam + i, sizeof(val));
tagparam[i] = '\0'; i--;
//find ATTR end
while (i > 0) && (tagparam[i] != '=') i--;
tagparam[i+1] = '\0';
}
else
{
//find VAL end
//already have
//find VAL start and copy
while (i > 0) && (tagparam[i] != '=') i--;
i++;
strlcpy(#val, #tagparam + i, sizeof(val));
tagparam[i] = '\0';
//find ATTR end
//already have
}
//find ATTR start and copy
while (i>0) && (!__isWhite(tagparam[i])) i--;
strlcpy(#attr, #tagparam + i + 1, sizeof(attr));
tagparam[i] = '\0';
strlwr(#attr);
if (debug_mode) {
if (quotes) {
debug("quote: "); debugch(quotes); debugln(" ");
}
else {
debugln("unquoted text");
}
sprintf(#param, "val: %s\nattr: %s\n\n", #val, #attr);
debug(#param);
}
return true;
}
unsigned int GetNextParam_OLD()
{ {
byte kavichki=0; byte kavichki=0;
int i = strlen(#tagparam) - 1; int i = strlen(#tagparam) - 1;
@ -30,7 +107,7 @@ unsigned int GetNextParam()
FOR ( ; ((tagparam[i] <>' ') && (i > 0); i--) FOR ( ; ((tagparam[i] <>' ') && (i > 0); i--)
{ {
IF (tagparam[i] == '=') //äåðçêàÿ çàãëóøêà IF (tagparam[i] == '=') //dirty fix (kludge)
tagparam[i + 1] = 0x00; tagparam[i + 1] = 0x00;
} }
strlcpy(#attr, #tagparam + i + 1, sizeof(attr)); strlcpy(#attr, #tagparam + i + 1, sizeof(attr));

View File

@ -58,7 +58,7 @@ char *unicode_tags[]={
"#1031", "\244", "#1031", "\244",
"#8470", "N", "#8470", "N",
"bull", "-", //вообще здесь точка "bull", "\31", //вообще здесь точка
"percnt","%", "percnt","%",
0}; 0};

View File

@ -32,7 +32,7 @@ _http http = {0, 0, 0, 0, 0, 0, 0};
char homepage[] = FROM "html\\homepage.htm""\0"; char homepage[] = FROM "html\\homepage.htm""\0";
#ifdef LANG_RUS #ifdef LANG_RUS
char version[]="’¥ªáâ®¢ë© ¡à ã§¥à 1.74"; char version[]="’¥ªáâ®¢ë© ¡à ã§¥à 1.8";
?define IMAGES_CACHE_CLEARED "Šíè ª à⨭®ª ®ç¨é¥­" ?define IMAGES_CACHE_CLEARED "Šíè ª à⨭®ª ®ç¨é¥­"
?define T_LAST_SLIDE "<EFBFBD>â® ¯®á«¥¤­¨© á« ©¤" ?define T_LAST_SLIDE "<EFBFBD>â® ¯®á«¥¤­¨© á« ©¤"
char loading[] = "‡ £à㧪  áâà ­¨æë...<br>"; char loading[] = "‡ £à㧪  áâà ­¨æë...<br>";
@ -47,7 +47,7 @@ char link_menu[] =
"Š®¯¨à®¢ âì áá뫪ã "Š®¯¨à®¢ âì áá뫪ã
ª ç âì ᮤ¥à¦¨¬®¥ áá뫪¨"; ª ç âì ᮤ¥à¦¨¬®¥ áá뫪¨";
#else #else
char version[]="Text-based Browser 1.74"; char version[]="Text-based Browser 1.8";
?define IMAGES_CACHE_CLEARED "Images cache cleared" ?define IMAGES_CACHE_CLEARED "Images cache cleared"
?define T_LAST_SLIDE "This slide is the last" ?define T_LAST_SLIDE "This slide is the last"
char loading[] = "Loading...<br>"; char loading[] = "Loading...<br>";
@ -83,6 +83,9 @@ dword col_bg;
dword panel_color; dword panel_color;
dword border_color; dword border_color;
bool debug_mode = false;
bool old_tag_parser_mode = false;
progress_bar wv_progress_bar; progress_bar wv_progress_bar;
bool souce_mode = false; bool souce_mode = false;
bool open_in_a_new_window = false; bool open_in_a_new_window = false;
@ -98,7 +101,7 @@ enum {
VIEW_HISTORY, VIEW_HISTORY,
//FREE_IMG_CACHE, //FREE_IMG_CACHE,
DOWNLOAD_MANAGER, DOWNLOAD_MANAGER,
COPY_LINK=1200, COPY_LINK_URL=1200,
DOWNLOAD_LINK_CONTENTS, DOWNLOAD_LINK_CONTENTS,
}; };
@ -114,7 +117,6 @@ edit_box address_box = {250,60,30,0xffffff,0x94AECE,0xffffff,0xffffff,0x10000000
void main() void main()
{ {
CursorPointer.Load(#CursorFile);
load_dll(boxlib, #box_lib_init,0); load_dll(boxlib, #box_lib_init,0);
load_dll(libio, #libio_init,1); load_dll(libio, #libio_init,1);
load_dll(libimg, #libimg_init,1); load_dll(libimg, #libimg_init,1);
@ -132,15 +134,12 @@ void main()
case evMouse: case evMouse:
edit_box_mouse stdcall (#address_box); edit_box_mouse stdcall (#address_box);
mouse.get(); mouse.get();
if (WB1.list.MouseOver(mouse.x, mouse.y))
{
if (PageLinks.HoverAndProceed(mouse.x, WB1.list.first + mouse.y)) if (PageLinks.HoverAndProceed(mouse.x, WB1.list.first + mouse.y))
&& (bufsize) && (mouse.pkm) && (mouse.up) { && (bufsize) && (mouse.pkm) && (mouse.up) {
EventShowPageMenu(mouse.x, mouse.y); if (WB1.list.MouseOver(mouse.x, mouse.y)) EventShowPageMenu(mouse.x, mouse.y);
break; break;
} }
if (WB1.list.MouseScroll(mouse.vert)) WB1.DrawPage(); if (WB1.list.MouseScroll(mouse.vert)) WB1.DrawPage();
}
scrollbar_v_mouse (#scroll_wv); scrollbar_v_mouse (#scroll_wv);
if (WB1.list.first != scroll_wv.position) if (WB1.list.first != scroll_wv.position)
{ {
@ -192,47 +191,28 @@ void main()
if (http.status_code >= 300) && (http.status_code < 400) if (http.status_code >= 300) && (http.status_code < 400)
{ {
redirected++; redirected++;
if (redirected<=5) if (redirected>5)
{ {
if (http.handle_redirect()) { notify("'Too many redirects.' -E");
if (!strncmp(#URL,"https://",8))
{
history.back();
strcpy(#editURL, history.current());
strcpy(#URL, history.current());
ShowErrorMessageThatHttpsIsNotSupportedYet();
StopLoading(); StopLoading();
break;
}
}
} }
else else
{ {
notify("Too many redirects"); http.handle_redirect();
StopLoading();
break;
}
}
else
{
redirected = 0;
}
// Loading the page is complete, free resources
if (redirected>0)
{
http.free(); http.free();
GetAbsoluteURL(#URL); GetAbsoluteURL(#http.redirect_url);
history.back(); history.back();
strcpy(#editURL, #URL); strcpy(#editURL, #URL);
DrawEditBoxWebView(); DrawEditBoxWebView();
OpenPage(); OpenPage();
} }
else break;
{ }
redirected = 0;
// Loading the page is complete, free resources
history.add(#URL); history.add(#URL);
ESI = http.transfer; bufpointer = http.content_pointer;
bufpointer = ESI.http_msg.content_ptr; bufsize = http.content_received;
bufsize = ESI.http_msg.content_received;
http.free(); http.free();
SetPageDefaults(); SetPageDefaults();
ShowPage(); ShowPage();
@ -240,7 +220,6 @@ void main()
} }
} }
} }
}
void SetElementSizes() void SetElementSizes()
{ {
@ -275,7 +254,12 @@ void Draw_Window()
img_draw stdcall(skin.image, Form.cwidth-24, address_box.top-3, 17, skin.h, 87, 0); img_draw stdcall(skin.image, Form.cwidth-24, address_box.top-3, 17, skin.h, 87, 0);
DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,STATUSBAR_H, col_bg); DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,STATUSBAR_H, col_bg);
DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,1, border_color); DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,1, border_color);
if (!header) OpenPage(); else { WB1.DrawPage(); DrawEditBoxWebView(); } if (!header)
OpenPage();
else {
WB1.DrawPage();
DrawEditBoxWebView();
}
DrawRectangle(scroll_wv.start_x, scroll_wv.start_y, scroll_wv.size_x, scroll_wv.size_y-1, scroll_wv.bckg_col); DrawRectangle(scroll_wv.start_x, scroll_wv.start_y, scroll_wv.size_x, scroll_wv.size_y-1, scroll_wv.bckg_col);
DrawProgress(); DrawProgress();
} }
@ -303,7 +287,10 @@ void ProcessEvent(dword id__)
return; return;
case GOTOURL_BUTTON: case GOTOURL_BUTTON:
case SCAN_CODE_ENTER: case SCAN_CODE_ENTER:
if (!strncmp(#editURL,"http:",5)) || (editURL[0]=='/') if (!editURL[0]) {
strcpy(#URL, URL_SERVICE_HOME);
}
else if (!strncmp(#editURL,"http:",5)) || (editURL[0]=='/')
|| (!strncmp(#editURL,"https:",6)) || (!strncmp(#editURL,"WebView:",8)) || (!strncmp(#editURL,"https:",6)) || (!strncmp(#editURL,"WebView:",8))
{ {
strcpy(#URL, #editURL); strcpy(#URL, #editURL);
@ -334,7 +321,7 @@ void ProcessEvent(dword id__)
WB1.LoadInternalPage(bufpointer, bufsize); WB1.LoadInternalPage(bufpointer, bufsize);
break; break;
case EDIT_SOURCE: case EDIT_SOURCE:
if (!strncmp(#URL,"http:",5)) if (!strncmp(#URL,"http",4))
{ {
CreateFile(bufsize, bufpointer, "/tmp0/1/WebView_tmp.htm"); CreateFile(bufsize, bufpointer, "/tmp0/1/WebView_tmp.htm");
if (!EAX) RunProgram("/rd/1/tinypad", "/tmp0/1/WebView_tmp.htm"); if (!EAX) RunProgram("/rd/1/tinypad", "/tmp0/1/WebView_tmp.htm");
@ -356,7 +343,7 @@ void ProcessEvent(dword id__)
CreateThread(#Downloader,#downloader_stak+4092); CreateThread(#Downloader,#downloader_stak+4092);
} }
return; return;
case COPY_LINK: case COPY_LINK_URL:
Clipboard__CopyText(PageLinks.GetURL(PageLinks.active)); Clipboard__CopyText(PageLinks.GetURL(PageLinks.active));
notify("'URL copied to clipboard'O"); notify("'URL copied to clipboard'O");
return; return;
@ -366,6 +353,16 @@ void ProcessEvent(dword id__)
CreateThread(#Downloader,#downloader_stak+4092); CreateThread(#Downloader,#downloader_stak+4092);
} }
return; return;
case SCAN_CODE_F12:
debug_mode ^= 1;
if (debug_mode) notify("'Debug mode ON'-I");
else notify("'Debug mode OFF'-I");
return;
case SCAN_CODE_F11:
old_tag_parser_mode ^= 1;
if (old_tag_parser_mode) notify("'Old tag parser ON'-I");
else notify("'Old tag parser OFF'-I");
return;
} }
} }
@ -397,6 +394,7 @@ void SetPageDefaults()
void OpenPage() void OpenPage()
{ {
char getUrl[sizeof(URL)];
StopLoading(); StopLoading();
souce_mode = false; souce_mode = false;
strcpy(#editURL, #URL); strcpy(#editURL, #URL);
@ -409,10 +407,18 @@ void OpenPage()
DrawEditBoxWebView(); DrawEditBoxWebView();
return; return;
} }
if (!strncmp(#URL,"http:",5)) if (!strncmp(#URL,"http:",5)) || (!strncmp(#URL,"https://",8))
{ {
img_draw stdcall(skin.image, address_box.left+address_box.width+1, address_box.top-3, 17, skin.h, 131, 0); img_draw stdcall(skin.image, address_box.left+address_box.width+1, address_box.top-3, 17, skin.h, 131, 0);
if (!strncmp(#URL,"http:",5)) {
http.get(#URL); http.get(#URL);
}
if (!strncmp(#URL,"https://",8)) {
sprintf(#getUrl, "http://gate.aspero.pro/?site=%s", #URL);
http.get(#getUrl);
}
//http.get(#URL);
if (!http.transfer) if (!http.transfer)
{ {
StopLoading(); StopLoading();
@ -452,7 +458,6 @@ DrawEditBoxWebView()
void ShowPage() void ShowPage()
{ {
DrawEditBoxWebView(); DrawEditBoxWebView();
debugval("bufsize", bufsize);
if (!bufsize) if (!bufsize)
{ {
if (http.transfer) WB1.LoadInternalPage(#loading, sizeof(loading)); if (http.transfer) WB1.LoadInternalPage(#loading, sizeof(loading));
@ -486,10 +491,10 @@ int SetSkinColors()
void DrawProgress() void DrawProgress()
{ {
unsigned long btn; dword persent;
if (http.transfer == 0) return; if (http.transfer == 0) return;
if (wv_progress_bar.max) btn = address_box.width*wv_progress_bar.value/wv_progress_bar.max; else btn = 30; if (wv_progress_bar.max) persent = wv_progress_bar.value*100/wv_progress_bar.max; else persent = 10;
DrawBar(address_box.left-2, address_box.top+20, btn, 2, wv_progress_bar.progress_color); DrawBar(address_box.left-2, address_box.top+20, persent*address_box.width/100, 2, wv_progress_bar.progress_color);
} }
@ -501,7 +506,6 @@ void ClickLink()
StopLoading(); StopLoading();
history.back(); history.back();
} }
strcpy(#URL, PageLinks.GetURL(PageLinks.active)); strcpy(#URL, PageLinks.GetURL(PageLinks.active));
//#1 //#1
if (URL[0] == '#') if (URL[0] == '#')
@ -532,17 +536,9 @@ void ClickLink()
return; return;
} }
if (!strncmp(#URL,"https://",8))
{
ShowErrorMessageThatHttpsIsNotSupportedYet();
strcpy(#editURL, history.current());
strcpy(#URL, history.current());
return;
}
GetAbsoluteURL(#URL); GetAbsoluteURL(#URL);
if (strncmp(#URL,"http://",7)!=0) if (strncmp(#URL,"http://",7)!=0) && (strncmp(#URL,"https://",8)!=0)
{ {
if (UrlExtIs(".htm")!=true) && (UrlExtIs(".html")!=true) if (UrlExtIs(".htm")!=true) && (UrlExtIs(".html")!=true)
{ {
@ -587,7 +583,7 @@ void EventShowPageMenu(dword _left, _top)
void EventShowLinkMenu(dword _left, _top) void EventShowLinkMenu(dword _left, _top)
{ {
menu.show(Form.left+_left-6,Form.top+_top+skin_height+3, 220, #link_menu, COPY_LINK); menu.show(Form.left+_left-6,Form.top+_top+skin_height+3, 220, #link_menu, COPY_LINK_URL);
} }
void EventUpdateProgressBar() void EventUpdateProgressBar()
@ -600,12 +596,6 @@ void EventUpdateProgressBar()
} }
} }
void ShowErrorMessageThatHttpsIsNotSupportedYet()
{
notify("'HTTPS protocol is not supported yet' -E");
}
DrawStatusBar(dword _status_text) DrawStatusBar(dword _status_text)
{ {
status_text.start_x = wv_progress_bar.left + wv_progress_bar.width + 10; status_text.start_x = wv_progress_bar.left + wv_progress_bar.width + 10;

View File

@ -73,10 +73,10 @@ void Downloader()
default: default:
if (!downloader.MonitorProgress()) break; if (!downloader.MonitorProgress()) break;
pb.max = downloader.data_full_size; pb.max = downloader.httpd.content_length;
if (pb.value != downloader.data_downloaded_size) if (pb.value != downloader.httpd.content_received)
{ {
pb.value = downloader.data_downloaded_size; pb.value = downloader.httpd.content_received;
progressbar_draw stdcall(#pb); progressbar_draw stdcall(#pb);
DrawDownloading(); DrawDownloading();
} }
@ -153,7 +153,7 @@ void StartDownloading()
void DrawDownloading() void DrawDownloading()
{ {
char bytes_received[70]; char bytes_received[70];
sprintf(#bytes_received, KB_RECEIVED, ConvertSizeToKb(downloader.data_downloaded_size) ); sprintf(#bytes_received, KB_RECEIVED, ConvertSizeToKb(downloader.httpd.content_received) );
DrawBar(15, pb.top + 22, strlen(#bytes_received+4)*12, 16, system.color.work); DrawBar(15, pb.top + 22, strlen(#bytes_received+4)*12, 16, system.color.work);
WriteText(15, pb.top + 22, 0x90, system.color.work_text, #bytes_received); WriteText(15, pb.top + 22, 0x90, system.color.work_text, #bytes_received);
progressbar_draw stdcall(#pb); progressbar_draw stdcall(#pb);
@ -182,7 +182,7 @@ void SaveDownloadedFile()
for (i=0; i<strlen(#filepath); i++) if(filepath[i]==':')||(filepath[i]=='?')filepath[i]='-'; for (i=0; i<strlen(#filepath); i++) if(filepath[i]==':')||(filepath[i]=='?')filepath[i]='-';
if (CreateFile(downloader.data_downloaded_size, downloader.bufpointer, #filepath)==0) if (CreateFile(downloader.httpd.content_received, downloader.bufpointer, #filepath)==0)
sprintf(#notify_message, "%s%s%s",FILE_SAVED_AS,#filepath,"' -Dt"); sprintf(#notify_message, "%s%s%s",FILE_SAVED_AS,#filepath,"' -Dt");
else else
sprintf(#notify_message, "%s%s%s","'Download manager\nError! Can\96t save file as ",#filepath,"' -Et"); sprintf(#notify_message, "%s%s%s","'Download manager\nError! Can\96t save file as ",#filepath,"' -Et");

View File

@ -41,6 +41,8 @@
#define SCAN_CODE_PLUS 013 #define SCAN_CODE_PLUS 013
#define SCAN_CODE_F1 059 #define SCAN_CODE_F1 059
#define SCAN_CODE_F11 087
#define SCAN_CODE_F12 088
#define SCAN_CODE_KEY_B 048 #define SCAN_CODE_KEY_B 048
#define SCAN_CODE_KEY_C 046 #define SCAN_CODE_KEY_C 046

View File

@ -13,6 +13,8 @@ struct _http
dword status_code; dword status_code;
dword receive_result; dword receive_result;
dword content_pointer; dword content_pointer;
char redirect_url[4096*3];
char finaladress[4096*3];
dword get(); dword get();
void free(); void free();
@ -39,17 +41,19 @@ void _http::receive()
http_receive stdcall (transfer); http_receive stdcall (transfer);
receive_result = EAX; receive_result = EAX;
ESI = transfer; EDI = transfer;
if (!EAX) status_code = ESI.http_msg.status; if (!EAX) {
content_length = ESI.http_msg.content_length; status_code = EDI.http_msg.status;
content_received = ESI.http_msg.content_received; content_pointer = EDI.http_msg.content_ptr;
}
content_length = EDI.http_msg.content_length;
content_received = EDI.http_msg.content_received;
} }
bool _http::handle_redirect() bool _http::handle_redirect()
{ {
dword redirect, i; dword redirect;
char redirect_url[4096*3], finaladress[4096*3];
http_find_header_field stdcall (transfer, "location\0"); http_find_header_field stdcall (transfer, "location\0");
if (EAX!=0) { if (EAX!=0) {
ESI = EAX; ESI = EAX;
@ -81,13 +85,11 @@ enum {
struct DOWNLOADER { struct DOWNLOADER {
_http httpd; _http httpd;
unsigned data_downloaded_size, data_full_size;
dword bufpointer, bufsize, url; dword bufpointer, bufsize, url;
int state; int state;
dword Start(); dword Start();
void Stop(); void Stop();
void Completed(); bool MonitorProgress();
int MonitorProgress();
} downloader; } downloader;
dword DOWNLOADER::Start(dword _url) dword DOWNLOADER::Start(dword _url)
@ -113,43 +115,30 @@ void DOWNLOADER::Stop()
bufsize = 0; bufsize = 0;
bufpointer = free(bufpointer); bufpointer = free(bufpointer);
} }
data_downloaded_size = data_full_size = 0; httpd.content_received = httpd.content_length = 0;
} }
void DOWNLOADER::Completed() bool DOWNLOADER::MonitorProgress()
{ {
state = STATE_COMPLETED;
ESI = httpd.transfer;
bufpointer = ESI.http_msg.content_ptr;
bufsize = ESI.http_msg.content_received;
httpd.free();
}
int DOWNLOADER::MonitorProgress()
{
dword receive_result;
char redirect_url[4096*3], finaladress[4096*3];
if (httpd.transfer <= 0) return false; if (httpd.transfer <= 0) return false;
http_receive stdcall (httpd.transfer); httpd.receive();
receive_result = EAX; if (!httpd.content_length) httpd.content_length = httpd.content_received * 20;
EDI = httpd.transfer;
httpd.status_code = EDI.http_msg.status;
data_full_size = EDI.http_msg.content_length;
data_downloaded_size = EDI.http_msg.content_received;
if (!data_full_size) data_full_size = data_downloaded_size * 6 + 1;
if (receive_result == 0) { if (httpd.receive_result == 0) {
if (httpd.status_code >= 300) && (httpd.status_code < 400) if (httpd.status_code >= 300) && (httpd.status_code < 400)
{ {
httpd.handle_redirect(); httpd.handle_redirect();
strcpy(url, httpd.url); strcpy(url, httpd.url);
get_absolute_url(#finaladress, url, #redirect_url); get_absolute_url(#httpd.finaladress, url, #httpd.redirect_url);
Stop(); Stop();
Start(#finaladress); Start(#httpd.finaladress);
url = #finaladress; url = #httpd.finaladress;
return false; return false;
} }
Completed(); state = STATE_COMPLETED;
bufpointer = httpd.content_pointer;
bufsize = httpd.content_received;
httpd.free();
} }
return true; return true;
} }
@ -191,8 +180,6 @@ int check_is_the_url_absolute(dword _in)
void get_absolute_url(dword _rez, _base, _new) void get_absolute_url(dword _rez, _base, _new)
{ {
int i; int i;
debug("_base:");debugln(_base);
debug("_new:");debugln(_new);
//case: ./valera.html //case: ./valera.html
if (!strncmp(_new,"./", 2)) _new+=2; if (!strncmp(_new,"./", 2)) _new+=2;
//case: http://site.name //case: http://site.name
@ -222,5 +209,4 @@ void get_absolute_url(dword _rez, _base, _new)
strcat(_rez, _new); strcat(_rez, _new);
_GET_ABSOLUTE_URL_END: _GET_ABSOLUTE_URL_END:
while (i=strstr(_rez, "&amp;")) strcpy(i+1, i+5); while (i=strstr(_rez, "&amp;")) strcpy(i+1, i+5);
debug("_rez:");debugln(_rez);
} }