Commit e8d6381ff37bbd75fccac6c48502a80d0220bb79
1 parent
cde771f1
[!] speed up drastically the upload management on web server
Showing
1 changed file
with
40 additions
and
45 deletions
Show diff stats
web/CXM_multihost_http_server.anubis
| @@ -748,7 +748,7 @@ define String | @@ -748,7 +748,7 @@ define String | ||
| 748 | 748 | ||
| 749 | *** [2.3] A set of state variables for the server. | 749 | *** [2.3] A set of state variables for the server. |
| 750 | 750 | ||
| 751 | -type SState: | 751 | +public type SState: |
| 752 | sstate | 752 | sstate |
| 753 | ( | 753 | ( |
| 754 | Var(List(Word8)) unput_chars, // for reading requests | 754 | Var(List(Word8)) unput_chars, // for reading requests |
| @@ -1822,8 +1822,8 @@ define Result(Error,Int) | @@ -1822,8 +1822,8 @@ define Result(Error,Int) | ||
| 1822 | { | 1822 | { |
| 1823 | [ ] then ok(0), | 1823 | [ ] then ok(0), |
| 1824 | [h . t] then if h is http_header(name,value) then | 1824 | [h . t] then if h is http_header(name,value) then |
| 1825 | - if name = "content-length" | ||
| 1826 | - then if decimal_scan(value) is | 1825 | + if name = "content-length" then |
| 1826 | + if decimal_scan(value) is | ||
| 1827 | { | 1827 | { |
| 1828 | failure then error(incorrect_content_length_value), | 1828 | failure then error(incorrect_content_length_value), |
| 1829 | success(n) then ok(n) | 1829 | success(n) then ok(n) |
| @@ -1831,15 +1831,7 @@ define Result(Error,Int) | @@ -1831,15 +1831,7 @@ define Result(Error,Int) | ||
| 1831 | else get_body_size(t) | 1831 | else get_body_size(t) |
| 1832 | }. | 1832 | }. |
| 1833 | 1833 | ||
| 1834 | - | ||
| 1835 | - | ||
| 1836 | - | ||
| 1837 | - | ||
| 1838 | - | ||
| 1839 | - | ||
| 1840 | - | ||
| 1841 | - | ||
| 1842 | - | 1834 | + |
| 1843 | *** [4.10] Reading the body of the request. | 1835 | *** [4.10] Reading the body of the request. |
| 1844 | 1836 | ||
| 1845 | The body of the request may be very big (it contains uploaded files, if any). We read | 1837 | The body of the request may be very big (it contains uploaded files, if any). We read |
| @@ -2737,21 +2729,23 @@ define Maybe((String,Maybe(String))) | @@ -2737,21 +2729,23 @@ define Maybe((String,Maybe(String))) | ||
| 2737 | *** [5.7.4] Saving an uploaded file under a temporary filename. | 2729 | *** [5.7.4] Saving an uploaded file under a temporary filename. |
| 2738 | 2730 | ||
| 2739 | define Maybe(String) // returns the temporary file name | 2731 | define Maybe(String) // returns the temporary file name |
| 2740 | - save_uploaded_file | ||
| 2741 | - ( | ||
| 2742 | - Web_Site_Description desc, | ||
| 2743 | - RStream body_fd, | 2732 | + save_uploaded_file |
| 2733 | + ( | ||
| 2734 | + String web_site_dir, | ||
| 2735 | +// Web_Site_Description desc, | ||
| 2736 | + | ||
| 2737 | + RStream body_fd, | ||
| 2744 | // ByteArray body, | 2738 | // ByteArray body, |
| 2745 | - Int start, | ||
| 2746 | - Int end, | ||
| 2747 | - SState s | ||
| 2748 | - ) = | 2739 | + Int start, |
| 2740 | + Int end, | ||
| 2741 | + SState s | ||
| 2742 | + ) = | ||
| 2749 | s.uploaded_file_count <- 1 + *(s.uploaded_file_count); | 2743 | s.uploaded_file_count <- 1 + *(s.uploaded_file_count); |
| 2750 | with tfn = "_"+to_decimal(virtual_machine_id)+"_"+to_decimal(*(s.uploaded_file_count)), | 2744 | with tfn = "_"+to_decimal(virtual_machine_id)+"_"+to_decimal(*(s.uploaded_file_count)), |
| 2751 | // println("save_uploaded_file to :"+site_directory(desc)+"/upload_temporary/"+tfn); | 2745 | // println("save_uploaded_file to :"+site_directory(desc)+"/upload_temporary/"+tfn); |
| 2752 | // println("start offset = "+start+" end offset = "+end); | 2746 | // println("start offset = "+start+" end offset = "+end); |
| 2753 | //make data_io which is the size of the file to extract | 2747 | //make data_io which is the size of the file to extract |
| 2754 | - if copy_Data_IO_to_file(make_data_io(body_fd, start, end - start), site_directory(desc)+"/upload_temporary/"+tfn) is copy_ok(_) | 2748 | + if copy_Data_IO_to_file(make_data_io(body_fd, start, end - start), web_site_dir+"/upload_temporary/"+tfn) is copy_ok(_) |
| 2755 | then success(tfn) | 2749 | then success(tfn) |
| 2756 | else failure | 2750 | else failure |
| 2757 | . | 2751 | . |
| @@ -2818,11 +2812,12 @@ define String | @@ -2818,11 +2812,12 @@ define String | ||
| 2818 | define Maybe(Web_arg) | 2812 | define Maybe(Web_arg) |
| 2819 | get_multipart_entity | 2813 | get_multipart_entity |
| 2820 | ( | 2814 | ( |
| 2821 | - Web_Site_Description desc, | ||
| 2822 | - String body_temp_file, | ||
| 2823 | - Int start_offset, //real offset in source file of the part | ||
| 2824 | - Int end_offset, //real offset in source file of the part | ||
| 2825 | - SState s | 2815 | + //Web_Site_Description desc, |
| 2816 | + String web_site_dir, | ||
| 2817 | + String body_temp_file, | ||
| 2818 | + Int start_offset, //real offset in source file of the part | ||
| 2819 | + Int end_offset, //real offset in source file of the part | ||
| 2820 | + SState s | ||
| 2826 | )= | 2821 | )= |
| 2827 | //Get header of the part | 2822 | //Get header of the part |
| 2828 | if find_the_first(body_temp_file, crlf+crlf, start_offset, end_offset) is | 2823 | if find_the_first(body_temp_file, crlf+crlf, start_offset, end_offset) is |
| @@ -2849,10 +2844,10 @@ define Maybe(Web_arg) | @@ -2849,10 +2844,10 @@ define Maybe(Web_arg) | ||
| 2849 | failure, | 2844 | failure, |
| 2850 | 2845 | ||
| 2851 | success(fn) then | 2846 | success(fn) then |
| 2852 | - if save_uploaded_file(desc, body_fd, start_offset+k+4, end_offset-2, s) is | 2847 | + if save_uploaded_file(web_site_dir, body_fd, start_offset+k+4, end_offset-2, s) is |
| 2853 | { | 2848 | { |
| 2854 | failure then failure, | 2849 | failure then failure, |
| 2855 | - success(tfn) then success(upload(name, remove_path(fn), site_directory(desc)+"/upload_temporary/"+tfn)) | 2850 | + success(tfn) then success(upload(name, remove_path(fn), web_site_dir+"/upload_temporary/"+tfn)) |
| 2856 | 2851 | ||
| 2857 | } | 2852 | } |
| 2858 | } | 2853 | } |
| @@ -2864,39 +2859,40 @@ define Maybe(Web_arg) | @@ -2864,39 +2859,40 @@ define Maybe(Web_arg) | ||
| 2864 | 2859 | ||
| 2865 | 2860 | ||
| 2866 | 2861 | ||
| 2867 | -define List(Web_arg) | 2862 | +public define List(Web_arg) |
| 2868 | read_multipart_form_data_encoded_web_args | 2863 | read_multipart_form_data_encoded_web_args |
| 2869 | ( | 2864 | ( |
| 2870 | - Web_Site_Description desc, | 2865 | + String web_site_dir, |
| 2866 | + //Web_Site_Description desc, | ||
| 2871 | String body_temp_file, | 2867 | String body_temp_file, |
| 2872 | String __boundary, | 2868 | String __boundary, |
| 2873 | Int file_offset, | 2869 | Int file_offset, |
| 2874 | SState s | 2870 | SState s |
| 2875 | ) = | 2871 | ) = |
| 2876 | with boundary_length = length(__boundary), | 2872 | with boundary_length = length(__boundary), |
| 2877 | -// println( | ||
| 2878 | -//"read_multipart_form_data_encoded_web_args | ||
| 2879 | -// boundary["+__boundary+"] | ||
| 2880 | -// body_temp_file : "+body_temp_file+" | ||
| 2881 | -// file_offset : "+file_offset); | 2873 | + println( |
| 2874 | +"read_multipart_form_data_encoded_web_args | ||
| 2875 | + boundary["+__boundary+"] | ||
| 2876 | + body_temp_file : "+body_temp_file+" | ||
| 2877 | + file_offset : "+file_offset); | ||
| 2882 | //get the first boundary position | 2878 | //get the first boundary position |
| 2883 | if find_the_first(body_temp_file, __boundary, file_offset) is | 2879 | if find_the_first(body_temp_file, __boundary, file_offset) is |
| 2884 | { | 2880 | { |
| 2885 | - failure then println("first boundary not found");[ ], | 2881 | + failure then println("first boundary NOT found");[ ], |
| 2886 | success(first) then | 2882 | success(first) then |
| 2887 | with first = first + file_offset, //adjust the offset to real offset in file | 2883 | with first = first + file_offset, //adjust the offset to real offset in file |
| 2888 | //get the second boundary position | 2884 | //get the second boundary position |
| 2889 | if find_the_first(body_temp_file, __boundary, first + boundary_length) is | 2885 | if find_the_first(body_temp_file, __boundary, first + boundary_length) is |
| 2890 | { | 2886 | { |
| 2891 | - failure then println("last boundary found");[ ], | 2887 | + failure then println("last boundary NOT found");[ ], |
| 2892 | success(last) then | 2888 | success(last) then |
| 2893 | with last = last + first + boundary_length, //adjust the offset to real offset in file | 2889 | with last = last + first + boundary_length, //adjust the offset to real offset in file |
| 2894 | //Extract the file content here | 2890 | //Extract the file content here |
| 2895 | - if get_multipart_entity(desc, body_temp_file, first+boundary_length, last, s) is | 2891 | + if get_multipart_entity(web_site_dir, body_temp_file, first+boundary_length, last, s) is |
| 2896 | { | 2892 | { |
| 2897 | failure then [ ], | 2893 | failure then [ ], |
| 2898 | success(wa) then | 2894 | success(wa) then |
| 2899 | - [wa . read_multipart_form_data_encoded_web_args(desc, body_temp_file, __boundary, last, s)] | 2895 | + [wa . read_multipart_form_data_encoded_web_args(web_site_dir, body_temp_file, __boundary, last, s)] |
| 2900 | } | 2896 | } |
| 2901 | } | 2897 | } |
| 2902 | }. | 2898 | }. |
| @@ -2921,7 +2917,7 @@ define One | @@ -2921,7 +2917,7 @@ define One | ||
| 2921 | failure then unique, | 2917 | failure then unique, |
| 2922 | success(boundary) then | 2918 | success(boundary) then |
| 2923 | with all_web_args = query_string(request_line) + | 2919 | with all_web_args = query_string(request_line) + |
| 2924 | - read_multipart_form_data_encoded_web_args(desc, | 2920 | + read_multipart_form_data_encoded_web_args(desc.site_directory, |
| 2925 | body_temp_file, | 2921 | body_temp_file, |
| 2926 | "--"+boundary, | 2922 | "--"+boundary, |
| 2927 | 0, | 2923 | 0, |
| @@ -3204,7 +3200,7 @@ define One | @@ -3204,7 +3200,7 @@ define One | ||
| 3204 | if get_body_size(headers) is | 3200 | if get_body_size(headers) is |
| 3205 | { | 3201 | { |
| 3206 | error(msg) then log_journal_msg(desc,format(msg)), | 3202 | error(msg) then log_journal_msg(desc,format(msg)), |
| 3207 | - ok(body_size) then | 3203 | + ok(body_size) then |
| 3208 | if rqline is request_line(type, uri, qstring) then | 3204 | if rqline is request_line(type, uri, qstring) then |
| 3209 | with rqline2 = request_line(type, handle_redirection(redirections(desc), uri, headers), qstring), | 3205 | with rqline2 = request_line(type, handle_redirection(redirections(desc), uri, headers), qstring), |
| 3210 | 3206 | ||
| @@ -3215,7 +3211,7 @@ define One | @@ -3215,7 +3211,7 @@ define One | ||
| 3215 | { | 3211 | { |
| 3216 | //WWW_URL | 3212 | //WWW_URL |
| 3217 | www_url then | 3213 | www_url then |
| 3218 | - if read_http_body(connection,body_size,constant_byte_array(0,0),1000) is | 3214 | + if read_http_body(connection, body_size, constant_byte_array(0,0), 1000) is |
| 3219 | { | 3215 | { |
| 3220 | error(msg) then log_journal_msg(desc,format(msg)), | 3216 | error(msg) then log_journal_msg(desc,format(msg)), |
| 3221 | ok(body) then | 3217 | ok(body) then |
| @@ -3228,8 +3224,7 @@ define One | @@ -3228,8 +3224,7 @@ define One | ||
| 3228 | 3224 | ||
| 3229 | if body_size > 0 then | 3225 | if body_size > 0 then |
| 3230 | with t0 = (UTime)unow, | 3226 | with t0 = (UTime)unow, |
| 3231 | - println("read body, size "+body_size); | ||
| 3232 | - | 3227 | + |
| 3233 | if get_socket_from_connection(conn(connection)) is | 3228 | if get_socket_from_connection(conn(connection)) is |
| 3234 | { | 3229 | { |
| 3235 | failure then println("can't get socket"), | 3230 | failure then println("can't get socket"), |
| @@ -3264,7 +3259,7 @@ define One | @@ -3264,7 +3259,7 @@ define One | ||
| 3264 | println("Can't copy data from stream to temporary file ") | 3259 | println("Can't copy data from stream to temporary file ") |
| 3265 | }}} | 3260 | }}} |
| 3266 | else | 3261 | else |
| 3267 | - println("bbody_size = 0 !") | 3262 | + println("body_size = 0 !") |
| 3268 | } | 3263 | } |
| 3269 | 3264 | ||
| 3270 | //print_delta("before send_answer"); | 3265 | //print_delta("before send_answer"); |