Commit b5f08a36efb7578a0910a2abde4a63f208d206e7

Authored by totoro
1 parent e91d9dd5

add Content_Disposition for send file. This allow to determine how the file is p…

…rocess by the browser inline (to be displayed) or attachment (to be downloaded)
web/CXM_making_a_web_site.anubis
@@ -341,7 +341,8 @@ public type WEB_Controller_Result: @@ -341,7 +341,8 @@ public type WEB_Controller_Result:
341 String additional_script 341 String additional_script
342 ), 342 ),
343 send_file( 343 send_file(
344 - String full_path //full path with file name of the file to send 344 + String full_path, //full path with file name of the file to send
  345 + Content_Disposition content_disposition //in which form the file must consider by the client (inline: try to display to user, attachment: save as file)
345 ), 346 ),
346 renderer_content( 347 renderer_content(
347 Maybe(WEB_Session) mb_session, //modified session if success else failure 348 Maybe(WEB_Session) mb_session, //modified session if success else failure
@@ -2248,15 +2249,15 @@ public define HTML_Off_Form @@ -2248,15 +2249,15 @@ public define HTML_Off_Form
2248 2249
2249 2250
2250 public define HTML_Off_Form 2251 public define HTML_Off_Form
2251 - private_download  
2252 - (  
2253 - String abs_path,  
2254 - String name,  
2255 - String extra_ext,  
2256 - String action_name,  
2257 - List((String,String)) args  
2258 - ) =  
2259 - private_download(abs_path,name,extra_ext,success((action_name,args))). 2252 + private_download
  2253 + (
  2254 + String abs_path,
  2255 + String name,
  2256 + String extra_ext,
  2257 + String action_name,
  2258 + List((String,String)) args
  2259 + ) =
  2260 + private_download(abs_path,name,extra_ext,success((action_name,args))).
2260 2261
2261 . 2262 .
2262 2263
@@ -2501,7 +2502,8 @@ public type HTTP_Answer: @@ -2501,7 +2502,8 @@ public type HTTP_Answer:
2501 Printable_tree /*content*/), 2502 Printable_tree /*content*/),
2502 json (HTTP_Status, /*http_status*/ 2503 json (HTTP_Status, /*http_status*/
2503 JsonValue), /*json value*/ 2504 JsonValue), /*json value*/
2504 - send_file (String file_path), //file to send to client. //TODO add call back for before, during, after send 2505 + send_file ( String file_path, //file to send to client. //TODO add call back for before, during, after send
  2506 + Content_Disposition c_disposition),
2505 http_raw (Printable_tree), 2507 http_raw (Printable_tree),
2506 html_content (HTTP_Status /*http_status*/, 2508 html_content (HTTP_Status /*http_status*/,
2507 HTML_Off_Form), 2509 HTML_Off_Form),
@@ -3655,7 +3657,7 @@ define (Maybe(WEB_Session), HTTP_Answer) @@ -3655,7 +3657,7 @@ define (Maybe(WEB_Session), HTTP_Answer)
3655 ajax(session, content, additional_script) then (session, json(http_ok, to_html_ajax_content(content, cinfo, additional_script))), 3657 ajax(session, content, additional_script) then (session, json(http_ok, to_html_ajax_content(content, cinfo, additional_script))),
3656 //ajax(content, additional_script) then (failure, json(http_ok, to_html_ajax_content(content, additional_script))), 3658 //ajax(content, additional_script) then (failure, json(http_ok, to_html_ajax_content(content, additional_script))),
3657 ajax(session, content, additional_script) then (session, json(http_ok, to_html_ajax_content(content, additional_script))), 3659 ajax(session, content, additional_script) then (session, json(http_ok, to_html_ajax_content(content, additional_script))),
3658 - send_file(file_path) then (failure, send_file(file_path)), 3660 + send_file(file_path, c_disposition) then (failure, send_file(file_path, c_disposition)),
3659 renderer_content(session, title, content) then 3661 renderer_content(session, title, content) then
3660 with the_session = if session is {failure then _session, success(__session) then __session}, 3662 with the_session = if session is {failure then _session, success(__session) then __session},
3661 with page_renderer = get_page_renderer(the_session, _current_page_renderer, page_renderers), 3663 with page_renderer = get_page_renderer(the_session, _current_page_renderer, page_renderers),
@@ -6375,8 +6377,8 @@ public define AWP_Handler_Answer //Printable_tree @@ -6375,8 +6377,8 @@ public define AWP_Handler_Answer //Printable_tree
6375 content 6377 content
6376 ]) 6378 ])
6377 , 6379 ,
6378 - send_file(file_path) then  
6379 - send_file(file_path), 6380 + send_file(file_path, c_disposition) then
  6381 + send_file(file_path, c_disposition),
6380 6382
6381 http_raw(Printable_tree content) then 6383 http_raw(Printable_tree content) then
6382 printable_tree(content), 6384 printable_tree(content),
web/CXM_multihost_http_server.anubis
@@ -187,10 +187,25 @@ read web/mime.anubis @@ -187,10 +187,25 @@ read web/mime.anubis
187 187
188 Each site is described by a 'web site description', which is a datum of type 188 Each site is described by a 'web site description', which is a datum of type
189 'Web_Site_Description'. 189 'Web_Site_Description'.
  190 +public type Content_Disposition:
  191 + inline,
  192 + attachment.
  193 +
  194 +public define String
  195 + to_String
  196 + (
  197 + Content_Disposition c_disposition
  198 + )=
  199 + if c_disposition is
  200 + {
  201 + inline then "inline",
  202 + attachment then "attachment"
  203 + }
  204 +.
190 205
191 public type AWP_Handler_Answer: 206 public type AWP_Handler_Answer:
192 printable_tree(Printable_tree p_tree), 207 printable_tree(Printable_tree p_tree),
193 - send_file(String full_path) 208 + send_file(String full_path, Content_Disposition c_disposition)
194 . 209 .
195 210
196 public type Web_Site_Description: 211 public type Web_Site_Description:
@@ -2145,21 +2160,24 @@ public define String @@ -2145,21 +2160,24 @@ public define String
2145 2160
2146 We send 2 headers 'Content-Type' and 'Content-Length'. 2161 We send 2 headers 'Content-Type' and 'Content-Length'.
2147 2162
  2163 +
  2164 +
2148 define List(HTTP_header) 2165 define List(HTTP_header)
2149 headers_for_send_file 2166 headers_for_send_file
2150 ( 2167 (
2151 - MIME mime_type,  
2152 - String filename,  
2153 - Int size,  
2154 - String etag,  
2155 - Maybe(FileTimes) mb_ftimes, 2168 + MIME mime_type,
  2169 + String filename,
  2170 + Int size,
  2171 + String etag,
  2172 + Maybe(FileTimes) mb_ftimes,
  2173 + Content_Disposition c_disposition
2156 )= 2174 )=
2157 with headers = (List(HTTP_header)) 2175 with headers = (List(HTTP_header))
2158 [ 2176 [
2159 http_header("Content-Type", to_String(mime_type)), 2177 http_header("Content-Type", to_String(mime_type)),
2160 http_header("Etag", "\""+etag+"\""), 2178 http_header("Etag", "\""+etag+"\""),
2161 http_header("Content-Length",to_decimal(size)), 2179 http_header("Content-Length",to_decimal(size)),
2162 - http_header("Content-Disposition", "attachment; filename=\"" + filename +"\"") 2180 + http_header("Content-Disposition", to_String(c_disposition)+"; filename=\"" + filename +"\"")
2163 2181
2164 ], 2182 ],
2165 if mb_ftimes is 2183 if mb_ftimes is
@@ -2241,6 +2259,7 @@ define One @@ -2241,6 +2259,7 @@ define One
2241 String filename, // name of file 2259 String filename, // name of file
2242 String full_path, // full path to the file (filename included) 2260 String full_path, // full path to the file (filename included)
2243 MIME mime_type, // mime type of the file 2261 MIME mime_type, // mime type of the file
  2262 + Content_Disposition c_disposition, // content disposition (inline, attachment)
2244 One -> One action_before_send_file //call to execute before sending file 2263 One -> One action_before_send_file //call to execute before sending file
2245 ) = 2264 ) =
2246 action_before_send_file(unique); 2265 action_before_send_file(unique);
@@ -2252,7 +2271,7 @@ define One @@ -2252,7 +2271,7 @@ define One
2252 { 2271 {
2253 false then 2272 false then
2254 forget(reliable_write(connection,to_byte_array("HTTP/1.1 200 OK"+crlf))); 2273 forget(reliable_write(connection,to_byte_array("HTTP/1.1 200 OK"+crlf)));
2255 - forget(reliable_write(connection,[format_headers(headers + headers_for_send_file(mime_type, filename, size, current_etag, mb_ftimes)) , crlf])); 2274 + forget(reliable_write(connection,[format_headers(headers + headers_for_send_file(mime_type, filename, size, current_etag, mb_ftimes, c_disposition)) , crlf]));
2256 //forget(copy_file_to_Connection(file, connection, size)), 2275 //forget(copy_file_to_Connection(file, connection, size)),
2257 send_file_body(desc,connection,file,size,0,filename), 2276 send_file_body(desc,connection,file,size,0,filename),
2258 true then 2277 true then
@@ -2285,33 +2304,34 @@ define Bool @@ -2285,33 +2304,34 @@ define Bool
2285 except if there is a valid authorization for private download. 2304 except if there is a valid authorization for private download.
2286 2305
2287 define One 2306 define One
2288 - send_file  
2289 - (  
2290 - Web_Site_Description desc,  
2291 - Connection connection,  
2292 - String uri,  
2293 - List(HTTP_header) input_headers,  
2294 - List(HTTP_header) output_headers,  
2295 - Maybe(String) mbauthorization,  
2296 - One -> One action_before_send_file  
2297 - ) =  
2298 - if mbauthorization is  
2299 - {  
2300 - //--- file without authorization: take it from public ---  
2301 - failure then if recognize_mime_type_from_uri(desc,uri) is  
2302 - {  
2303 - failure then log_journal_msg(desc,"No MIME type found for '"+uri+"'.\n"),  
2304 - success(mime_type) then  
2305 - with path = site_directory(desc)+"/public"+uri,  
2306 - if (Maybe(RStream))file(path, read) is  
2307 - {  
2308 - failure then  
2309 - println("HTTP/1.1 404 Not Found"+path);  
2310 - forget(reliable_write(connection,to_byte_array("HTTP/1.1 404 Not Found"+crlf+ 2307 + send_file
  2308 + (
  2309 + Web_Site_Description desc,
  2310 + Connection connection,
  2311 + String uri,
  2312 + List(HTTP_header) input_headers,
  2313 + List(HTTP_header) output_headers,
  2314 + Maybe(String) mbauthorization,
  2315 + Content_Disposition c_disposition,
  2316 + One -> One action_before_send_file
  2317 + )=
  2318 + if mbauthorization is
  2319 + {
  2320 + //--- file without authorization: take it from public ---
  2321 + failure then if recognize_mime_type_from_uri(desc,uri) is
  2322 + {
  2323 + failure then log_journal_msg(desc,"No MIME type found for '"+uri+"'.\n"),
  2324 + success(mime_type) then
  2325 + with path = site_directory(desc)+"/public"+uri,
  2326 + if (Maybe(RStream))file(path, read) is
  2327 + {
  2328 + failure then
  2329 + println("HTTP/1.1 404 Not Found"+path);
  2330 + forget(reliable_write(connection,to_byte_array("HTTP/1.1 404 Not Found"+crlf+
2311 "Content-Length: 0"+crlf+crlf 2331 "Content-Length: 0"+crlf+crlf
2312 /*+"Connection: close"+crlf+crlf*/))); 2332 /*+"Connection: close"+crlf+crlf*/)));
2313 - log_journal_msg(desc,"Cannot find file '"+path+"'.\n"),  
2314 - success(f) then with size = file_size(f), 2333 + log_journal_msg(desc,"Cannot find file '"+path+"'.\n"),
  2334 + success(f) then with size = file_size(f),
2315 send_file(desc, 2335 send_file(desc,
2316 connection, 2336 connection,
2317 input_headers, 2337 input_headers,
@@ -2321,6 +2341,7 @@ define One @@ -2321,6 +2341,7 @@ define One
2321 uri, 2341 uri,
2322 path, 2342 path,
2323 mime_type, 2343 mime_type,
  2344 + c_disposition,
2324 action_before_send_file) 2345 action_before_send_file)
2325 } 2346 }
2326 }, 2347 },
@@ -2336,10 +2357,10 @@ define One @@ -2336,10 +2357,10 @@ define One
2336 if (Maybe(RStream))file(absolute_path, read) is 2357 if (Maybe(RStream))file(absolute_path, read) is
2337 { 2358 {
2338 failure then 2359 failure then
2339 - println("HTTP/1.1 404 Not Found"+absolute_path);  
2340 - forget(reliable_write(connection,to_byte_array("HTTP/1.1 404 Not Found"+crlf+ 2360 + println("HTTP/1.1 404 Not Found"+absolute_path);
  2361 + forget(reliable_write(connection,to_byte_array("HTTP/1.1 404 Not Found"+crlf+
2341 "Content-Length: 0"+crlf+crlf 2362 "Content-Length: 0"+crlf+crlf
2342 - /*+"Connection: close"+crlf+crlf*/))); 2363 + )));
2343 log_journal_msg(desc,"Cannot find file '"+absolute_path+"'.\n"), 2364 log_journal_msg(desc,"Cannot find file '"+absolute_path+"'.\n"),
2344 success(f) then with size = file_size(f), 2365 success(f) then with size = file_size(f),
2345 mime_type = if recognize_mime_type_from_uri(desc,uri) is 2366 mime_type = if recognize_mime_type_from_uri(desc,uri) is
@@ -2356,6 +2377,7 @@ define One @@ -2356,6 +2377,7 @@ define One
2356 uri, 2377 uri,
2357 absolute_path, 2378 absolute_path,
2358 mime_type, 2379 mime_type,
  2380 + c_disposition,
2359 action_before_send_file) 2381 action_before_send_file)
2360 } 2382 }
2361 ) 2383 )
@@ -2369,6 +2391,7 @@ define One @@ -2369,6 +2391,7 @@ define One
2369 Connection connection, 2391 Connection connection,
2370 String uri, 2392 String uri,
2371 String absolute_path, 2393 String absolute_path,
  2394 + Content_Disposition c_disposition,
2372 List(HTTP_header) input_headers, 2395 List(HTTP_header) input_headers,
2373 List(HTTP_header) output_headers, 2396 List(HTTP_header) output_headers,
2374 One -> One action_before_send_file 2397 One -> One action_before_send_file
@@ -2396,6 +2419,7 @@ define One @@ -2396,6 +2419,7 @@ define One
2396 filename+"."+extension, 2419 filename+"."+extension,
2397 absolute_path, 2420 absolute_path,
2398 mime_type, 2421 mime_type,
  2422 + c_disposition,
2399 action_before_send_file 2423 action_before_send_file
2400 ) 2424 )
2401 } 2425 }
@@ -2410,7 +2434,7 @@ public define List(HTTP_header) @@ -2410,7 +2434,7 @@ public define List(HTTP_header)
2410 = 2434 =
2411 [ 2435 [
2412 http_header("Date", format_http_date(now)), 2436 http_header("Date", format_http_date(now)),
2413 - http_header("Server", "Anubis Embedded Server v" + major_version_number + "." + minor_version_number), 2437 + http_header("Server", "Anubis Calexium Embedded Server v" + major_version_number + "." + minor_version_number),
2414 /*http_header("Connection", "close"), */ 2438 /*http_header("Connection", "close"), */
2415 ]. 2439 ].
2416 2440
@@ -2463,10 +2487,10 @@ define One @@ -2463,10 +2487,10 @@ define One
2463 then 2487 then
2464 if awp_handler(desc)(host_name, http_inf, all_web_args, is_SSL(connection)) is 2488 if awp_handler(desc)(host_name, http_inf, all_web_args, is_SSL(connection)) is
2465 { 2489 {
2466 - printable_tree(answer_headers_body) then 2490 + printable_tree(answer_headers_body) then
2467 forget(reliable_write(connection, answer_headers_body)), 2491 forget(reliable_write(connection, answer_headers_body)),
2468 - send_file(file_path) then  
2469 - send_file_answer(desc, connection, uri, file_path, headers, standard_headers, 2492 + send_file(file_path, content_disposition) then
  2493 + send_file_answer(desc, connection, uri, file_path, content_disposition, headers, standard_headers,
2470 (One u) |-> before_send_file(desc)(http_inf, all_web_args)) 2494 (One u) |-> before_send_file(desc)(http_inf, all_web_args))
2471 } 2495 }
2472 else (send_file(desc, 2496 else (send_file(desc,
@@ -2479,6 +2503,7 @@ define One @@ -2479,6 +2503,7 @@ define One
2479 not_found then failure, 2503 not_found then failure,
2480 found(v) then success(v) 2504 found(v) then success(v)
2481 }, 2505 },
  2506 + inline,
2482 (One u) |-> before_send_file(desc)(http_inf, all_web_args)) 2507 (One u) |-> before_send_file(desc)(http_inf, all_web_args))
2483 //print_delta("After sending file") 2508 //print_delta("After sending file")
2484 )). 2509 )).
@@ -2980,8 +3005,8 @@ define One @@ -2980,8 +3005,8 @@ define One
2980 { 3005 {
2981 printable_tree(answer_headers_body) then 3006 printable_tree(answer_headers_body) then
2982 forget(reliable_write(connection, answer_headers_body)), 3007 forget(reliable_write(connection, answer_headers_body)),
2983 - send_file(file_path) then  
2984 - send_file_answer(desc, connection, uri, file_path, headers, standard_headers, 3008 + send_file(file_path, c_disposition) then
  3009 + send_file_answer(desc, connection, uri, file_path, c_disposition, headers, standard_headers,
2985 (One u) |-> before_send_file(desc)(http_inf, all_web_args)) 3010 (One u) |-> before_send_file(desc)(http_inf, all_web_args))
2986 } 3011 }
2987 3012