Commit 949610f9d1d08e5d9af777975857a7b1d79962cd

Authored by David RENÉ
1 parent 00ba34f0

in Anubis 1.19 read from file or connection now return a Maybe(ByteArray) instead of a ReadResult

Showing 1 changed file with 52 additions and 57 deletions   Show diff stats
web/CXM_multihost_http_server.anubis
... ... @@ -870,15 +870,15 @@ define One
870 870 }
871 871 }.
872 872  
873   -define ReadResult
874   - read_from_connexion
875   - (
876   - HTTP_Buffered_Connection connection,
877   - Int size,
878   - Int time_out,
879   - ByteArray result_buffer,
880   - Int position
881   - ) =
  873 +define Maybe(ByteArray)
  874 + read_from_connexion
  875 + (
  876 + HTTP_Buffered_Connection connection,
  877 + Int size,
  878 + Int time_out,
  879 + ByteArray result_buffer,
  880 + Int position
  881 + ) =
882 882 //println(pid + "read_from_connexion(" + size + ")");
883 883  
884 884 if *connection.read_pos < length(*connection.buffer) then
... ... @@ -898,15 +898,14 @@ define ReadResult
898 898 // ok(ba) then ok(result + ba)
899 899 // }
900 900 else
901   - ok(result_buffer)
  901 + success(result_buffer)
902 902 else
903 903 with t0 = (UTime) unow,
904 904 //if unow > dead_line then record_dubious_connection(connection,dead_line,dos) else
905 905 if read(connection.conn, 32768, time_out) is // the connection is closed after 10 minutes of inactivity
906 906 {
907   - error then println(pid + "read failed ["+to_string(result_buffer)+"]"); error,
908   - timeout then timeout,
909   - ok(ba) then
  907 + failure then println(pid + "read failed ["+to_string(result_buffer)+"]"); failure,
  908 + success(ba) then
910 909 with size_read = length(ba),
911 910 //the needed read is higher than the
912 911 if size > size_read then
... ... @@ -941,10 +940,9 @@ define Result(Error,Word8)
941 940 failure then
942 941 if read_from_connexion(connection,1,600, constant_byte_array(1,0),0) is // the connection is closed after 10 minutes of inactivity
943 942 {
944   - error then /*accumulate_t2(t2_tmp);*/ error(cannot_read_from_connection),
945   - timeout then /*accumulate_t2(t2_tmp);*/ error(timeout(600)),
  943 + failure then /*accumulate_t2(t2_tmp);*/ error(cannot_read_from_connection),
946 944 //record_dubious_connection(connection,dead_line,dos),
947   - ok(ba) then if nth(0,ba) is
  945 + success(ba) then if nth(0,ba) is
948 946 {
949 947 failure then /*accumulate_t2(t2_tmp);*/ error(cannot_read_from_connection),
950 948 success(c) then
... ... @@ -1897,28 +1895,27 @@ public define Result(Error, ByteArray)
1897 1895 ByteArray so_far, // when calling this function, 'so_far' is the empty byte array
1898 1896 Int retries // this function is called with retries = 10
1899 1897 )=
1900   - if body_size = 0 then ok(constant_byte_array(0,0)) else
1901   - if retries =< 0 then error(cannot_read_from_connection) else
  1898 + if body_size = 0 then ok(constant_byte_array(0,0)) else
  1899 + if retries =< 0 then error(cannot_read_from_connection) else
1902 1900  
1903   - if read_from_connexion(connection,body_size,60,constant_byte_array(body_size,0),0) is
1904   - {
1905   - error then error(cannot_read_from_connection),
1906   - timeout then error(timeout(60)),
1907   - ok(new_bytes) then with
  1901 + if read_from_connexion(connection,body_size,60,constant_byte_array(body_size,0),0) is
  1902 + {
  1903 + failure then error(cannot_read_from_connection),
  1904 + success(new_bytes) then
  1905 + with
1908 1906 ba = so_far + new_bytes, // contains all the bytes read so far
1909 1907 nr = length(ba), // total read since the beginning
1910 1908 nn = length(new_bytes), // number of bytes just read
1911   - if nr < body_size // must read more bytes
1912   - then if nn > 0 // if connection seems to work
1913   -
1914   - then
1915   - println("http body ("+body_size+") read "+nn+" bytes current size "+nr+" Bytes");
1916   - read_http_body(connection,body_size,ba,1000) // continue reading
1917   - else sleep(100); // otherwise, sleep 1/10 of second
1918   - read_http_body(connection,body_size,ba, // and retry reading
1919   - retries-1) // but no more than 10 times
  1909 + if nr < body_size then // must read more bytes
  1910 + if nn > 0 then // if connection seems to work
  1911 + println("http body ("+body_size+") read "+nn+" bytes current size "+nr+" Bytes");
  1912 + read_http_body(connection,body_size,ba,1000) // continue reading
  1913 + else
  1914 + sleep(100); // otherwise, sleep 1/10 of second
  1915 + read_http_body(connection,body_size,ba,retries-1) // and retry reading but no more than 10 times
1920 1916 else ok(ba) // required number of bytes has been read
1921   - }.
  1917 + }
  1918 +.
1922 1919  
1923 1920  
1924 1921 Note: During sleeping, 'anbexec' runs other machines. Actually, calling 'sleep', even
... ... @@ -2226,32 +2223,30 @@ define List(HTTP_header)
2226 2223 Sending the body of the answer (i.e. the file itself).
2227 2224  
2228 2225 define One
2229   - send_file_body
2230   - (
2231   - Web_Site_Description desc,
2232   - Connection connection, // connection with the client
2233   - Connection file, // file to be sent already opened
2234   - Int size, // size of file
2235   - Int sent, // bytes already sent
2236   - String filename // name of file
2237   - ) =
2238   - if sent >= size then
  2226 + send_file_body
  2227 + (
  2228 + Web_Site_Description desc,
  2229 + Connection connection, // connection with the client
  2230 + Connection file, // file to be sent already opened
  2231 + Int size, // size of file
  2232 + Int sent, // bytes already sent
  2233 + String filename // name of file
  2234 + ) =
  2235 + if sent >= size then
2239 2236 //TODO add call back on success if need
2240 2237 unique
2241   - else
2242   - if read(file,min(65536,size-sent),60) is
2243   - {
2244   - error then log_journal_msg(desc,"Cannot read from file '"+filename+"'.\n"),
2245   - timeout then log_journal_msg(desc,"Cannot read from file timeout'"+filename+"'.\n"),
2246   - ok(ba) then
2247   - with nr = length(ba), // get the number of bytes read
2248   - if reliable_write(connection, ba) is
2249   - {
2250   - failure then log_journal_msg(desc,"Cannot write into connection delirering '"+filename+"' (sent="+sent+"; size="+size+"; current="+nr+").\n"),
2251   - success(nw) then
2252   - send_file_body(desc,connection,file,size,sent+nw,filename)
2253   - }
2254   - }.
  2238 + else if read(file,min(65536,size-sent),60) is
  2239 + {
  2240 + failure then log_journal_msg(desc,"Cannot read from file '"+filename+"'.\n"),
  2241 + success(ba) then
  2242 + with nr = length(ba), // get the number of bytes read
  2243 + if reliable_write(connection, ba) is
  2244 + {
  2245 + failure then log_journal_msg(desc,"Cannot write into connection delirering '"+filename+"' (sent="+sent+"; size="+size+"; current="+nr+").\n"),
  2246 + success(nw) then send_file_body(desc,connection,file,size,sent+nw,filename)
  2247 + }
  2248 + }
  2249 +.
2255 2250  
2256 2251  
2257 2252 define String
... ...