WebView: proceed tags like "&nbsp" without ';' at the end

Downloader: handle "content-disposition" header to set correct filename from server renponse 

git-svn-id: svn://kolibrios.org@8319 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Kirill Lipatov (Leency) 2020-12-04 11:58:20 +00:00
parent 5832951836
commit 646af6780b
5 changed files with 38 additions and 47 deletions

View File

@ -210,7 +210,7 @@ void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){
} }
break; break;
case '&': //  and so on case '&': //  and so on
for (j=1, unicode_symbol=0; (ESBYTE[bufpos+j]<>';') && (j<8); j++) for (j=1, unicode_symbol=0; (ESBYTE[bufpos+j]<>';') && (!__isWhite(ESBYTE[bufpos+j])) && (j<8); j++)
{ {
bukva = ESBYTE[bufpos+j]; bukva = ESBYTE[bufpos+j];
chrcat(#unicode_symbol, bukva); chrcat(#unicode_symbol, bukva);

View File

@ -31,7 +31,7 @@
char editbox_icons[] = FROM "res/editbox_icons.raw"; char editbox_icons[] = FROM "res/editbox_icons.raw";
char version[]="WebView 2.7b"; char version[]="WebView 2.7c";
#include "texts.h" #include "texts.h"
#include "cache.h" #include "cache.h"
@ -911,7 +911,7 @@ dword GetAbsoluteActiveURL()
void CheckContentType() void CheckContentType()
{ {
char content_type[64]; char content_type[64];
if (http.header_field("content-type\0", #content_type, sizeof(content_type))) // application || image if (http.header_field("content-type", #content_type, sizeof(content_type))) // application || image
if (content_type[0] == 'a') || (content_type[0] == 'i') { if (content_type[0] == 'a') || (content_type[0] == 'i') {
EventOpenDownloader(history.current()); EventOpenDownloader(history.current());
StopLoading(); StopLoading();
@ -923,7 +923,7 @@ void CheckContentType()
void HandleRedirect() void HandleRedirect()
{ {
char redirect_url[URL_SIZE]; char redirect_url[URL_SIZE];
http.header_field("location\0", #redirect_url, URL_SIZE); http.header_field("location", #redirect_url, URL_SIZE);
get_absolute_url(#redirect_url, history.current()); get_absolute_url(#redirect_url, history.current());
history.back(); history.back();
http.hfree(); http.hfree();

View File

@ -34,7 +34,7 @@
#define WIN_W 580 #define WIN_W 580
#define WIN_H 100 #define WIN_H 100
char save_to[] = "/tmp0/1/Downloads"; char save_dir[] = "/tmp0/1/Downloads";
char dl_shared[] = "DL"; char dl_shared[] = "DL";
enum { enum {

View File

@ -7,7 +7,6 @@
#include "const.h" #include "const.h"
dword bufpointer, bufsize;
bool exit_param = false; bool exit_param = false;
_http http; _http http;
@ -28,8 +27,8 @@ void main()
load_dll(boxlib, #box_lib_init,0); load_dll(boxlib, #box_lib_init,0);
load_dll(libHTTP, #http_lib_init,1); load_dll(libHTTP, #http_lib_init,1);
if (!dir_exists(#save_to)) CreateDir(#save_to); if (!dir_exists(#save_dir)) CreateDir(#save_dir);
SetCurDir(#save_to); SetCurDir(#save_dir);
if (param) { if (param) {
if (!strncmp(#param, "-exit ", 6)) { if (!strncmp(#param, "-exit ", 6)) {
@ -45,7 +44,6 @@ void main()
} }
} }
if (main_url[0]) StartDownloading(); else strcpy(#main_url, "http://"); if (main_url[0]) StartDownloading(); else strcpy(#main_url, "http://");
EditBox_UpdateText(#ed, #main_url);
@SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER + EVM_STACK); @SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER + EVM_STACK);
@SetWindowLayerBehaviour(-1, ZPOS_ALWAYS_TOP); @SetWindowLayerBehaviour(-1, ZPOS_ALWAYS_TOP);
@ -112,7 +110,7 @@ void StartDownloading()
if (!strncmp(#main_url,"https:",6)) { if (!strncmp(#main_url,"https:",6)) {
miniprintf(#proxy_url, "http://gate.aspero.pro/?site=%s", #main_url); miniprintf(#proxy_url, "http://gate.aspero.pro/?site=%s", #main_url);
strcpy(#main_url, #proxy_url); strcpy(#main_url, #proxy_url);
EditBox_UpdateText(#ed, #main_url); EditBox_UpdateText(#ed, ed.flags);
//notify("'HTTPS for download is not supported, trying to download the file via HTTP' -W"); //notify("'HTTPS for download is not supported, trying to download the file via HTTP' -W");
//miniprintf(#http_url, "http://%s", #main_url+8); //miniprintf(#http_url, "http://%s", #main_url+8);
//if (!downloader.Start(#http_url)) { //if (!downloader.Start(#http_url)) {
@ -122,7 +120,7 @@ void StartDownloading()
} }
if (http.get(#main_url)) { if (http.get(#main_url)) {
ed.blur_border_color = 0xCACACA; ed.blur_border_color = 0xCACACA;
ed.flags = 100000000000b; EditBox_UpdateText(#ed, ed_disabled);
pb.value = 0; pb.value = 0;
DrawWindow(); DrawWindow();
} else { } else {
@ -150,14 +148,12 @@ void DrawDownloadingProgress()
void StopDownloading() void StopDownloading()
{ {
if (http.stop()) { http.stop();
bufsize = 0; if (http.content_pointer) http.content_pointer = free(http.content_pointer);
bufpointer = free(bufpointer);
}
http.content_received = http.content_length = 0; http.content_received = http.content_length = 0;
ed.blur_border_color = 0xFFFfff; ed.blur_border_color = 0xFFFfff;
ed.flags = 10b; EditBox_UpdateText(#ed, ed_focus);
DrawWindow(); DrawWindow();
} }
@ -168,57 +164,53 @@ void MonitorProgress()
http.receive(); http.receive();
if (!http.content_length) http.content_length = http.content_received * 20; //MOVE? if (!http.content_length) http.content_length = http.content_received * 20; //MOVE?
if (http.receive_result == 0) { if (http.receive_result) {
if (http.status_code >= 300) && (http.status_code < 400) DrawDownloadingProgress();
{ } else {
http.header_field("location\0", #redirect_url, URL_SIZE); if (http.status_code >= 300) && (http.status_code < 400) {
http.header_field("location", #redirect_url, URL_SIZE);
get_absolute_url(#redirect_url, #main_url); get_absolute_url(#redirect_url, #main_url);
strcpy(#main_url, #redirect_url); strcpy(#main_url, #redirect_url);
EditBox_UpdateText(#ed, #main_url);
StopDownloading(); StopDownloading();
StartDownloading(); StartDownloading();
return; return;
} }
bufpointer = http.content_pointer;
bufsize = http.content_received;
http.hfree();
}
DrawDownloadingProgress();
if (!http.receive_result)
{
SaveFile(); SaveFile();
if (exit_param) ExitProcess(); if (exit_param) ExitProcess();
StopDownloading(); StopDownloading();
DrawWindow(); DrawWindow();
return;
http.hfree();
} }
} }
void SaveFile() void SaveFile()
{ {
int i; int i;
char aux[2048];
char notify_message[4296]; char notify_message[4296];
char file_name[URL_SIZE+96];
//char file_name[URL_SIZE]; strcpy(#filepath, #save_dir);
//Content-Disposition: attachment; filename="RealFootball_2018_Nokia_5800_EN_IGP_EU_TS_101.zip"
//header_field("Content-Disposition\0", #redirect_url, URL_SIZE);
// Clean all slashes at the end
strcpy(#aux, #main_url);
while (aux[strlen(#aux)-1] == '/') {
aux[strlen(#aux)-1] = 0;
}
strcpy(#filepath, #save_to);
chrcat(#filepath, '/'); chrcat(#filepath, '/');
strcat(#filepath, #aux+strrchr(#aux, '/'));
//Content-Disposition: attachment; filename="RealFootball_2018_Nokia_5800_EN_IGP_EU_TS_101.zip"
if (http.header_field("content-disposition", #file_name, sizeof(file_name))) {
if (EDX = strstr(#file_name,"filename=\"")) {
strcat(#filepath, EDX+10);
ESBYTE[strchr(#filepath,'\"')] = '\0';
}
} else {
// Clean all slashes at the end
strcpy(#file_name, #main_url);
while (file_name[strlen(#file_name)-1] == '/') {
file_name[strlen(#file_name)-1] = 0;
}
strcat(#filepath, #file_name+strrchr(#file_name, '/'));
}
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(http.content_received, bufpointer, #filepath)==0) { if (CreateFile(http.content_received, http.content_pointer, #filepath)==0) {
miniprintf(#notify_message, FILE_SAVED_AS, #filepath); miniprintf(#notify_message, FILE_SAVED_AS, #filepath);
} else { } else {
miniprintf(#notify_message, FILE_NOT_SAVED, #filepath); miniprintf(#notify_message, FILE_NOT_SAVED, #filepath);

View File

@ -153,7 +153,6 @@ void _http::receive()
$dec edx $dec edx
} while (AL != 0) && (AL != 13) && (AL != 10) && (EDX>0); } while (AL != 0) && (AL != 13) && (AL != 10) && (EDX>0);
DSBYTE[EDI-1]='\0'; DSBYTE[EDI-1]='\0';
debugln(_dst);
return _dst; return _dst;
} }
return NULL; return NULL;