Commit 07f1bbce4bbd814d97625f59577e98fc4f8eceea

Authored by totoro
1 parent c65648e5

add helper for img_button with only img and web_action

add AWP_Handler_Answer instead of printable tree
add js_script which is helper for js_inline(script("text/javascript"), "...
web/CXM_making_a_web_site.anubis
@@ -350,7 +350,10 @@ public type WEB_Controller_Result: @@ -350,7 +350,10 @@ public type WEB_Controller_Result:
350 WEB_Session session, //modified session 350 WEB_Session session, //modified session
351 Printable_tree content, 351 Printable_tree content,
352 String additional_script 352 String additional_script
353 - ) 353 + ),
  354 + send_file(
  355 + String full_path //full path with file name of the file to send
  356 + )
354 . 357 .
355 358
356 public define WEB_Controller_Result 359 public define WEB_Controller_Result
@@ -1277,7 +1280,7 @@ public type JS_File: @@ -1277,7 +1280,7 @@ public type JS_File:
1277 public type Script: 1280 public type Script:
1278 script( String script_type, 1281 script( String script_type,
1279 String content). 1282 String content).
1280 - 1283 +
1281 public define JS_File 1284 public define JS_File
1282 js_file 1285 js_file
1283 ( 1286 (
@@ -1298,6 +1301,13 @@ public type HTML_Head_Tag: @@ -1298,6 +1301,13 @@ public type HTML_Head_Tag:
1298 css_inline(String css_styles) /* Note: <style> and </style> tags are not necessaries */ 1301 css_inline(String css_styles) /* Note: <style> and </style> tags are not necessaries */
1299 . 1302 .
1300 1303
  1304 +public define HTML_Head_Tag
  1305 + js_script
  1306 + (
  1307 + String script_content
  1308 + )=
  1309 + js_inline(script("text/javascript", script_content))
  1310 +.
1301 /* Label with help */ 1311 /* Label with help */
1302 1312
1303 1313
@@ -1733,17 +1743,22 @@ public type HTML_Off_Form: @@ -1733,17 +1743,22 @@ public type HTML_Off_Form:
1733 button (List(CoreAttrs), List(HTML_Off_Form) content), 1743 button (List(CoreAttrs), List(HTML_Off_Form) content),
1734 i (List(CoreAttrs), String text), 1744 i (List(CoreAttrs), String text),
1735 span (List(CoreAttrs), String text), 1745 span (List(CoreAttrs), String text),
  1746 + strong (List(CoreAttrs), List(HTML_Off_Form) content),
1736 hr (List(CoreAttrs)), 1747 hr (List(CoreAttrs)),
1737 h1 (List(CoreAttrs), List(HTML_Off_Form) content), 1748 h1 (List(CoreAttrs), List(HTML_Off_Form) content),
1738 h2 (List(CoreAttrs), List(HTML_Off_Form) content), 1749 h2 (List(CoreAttrs), List(HTML_Off_Form) content),
1739 h3 (List(CoreAttrs), List(HTML_Off_Form) content), 1750 h3 (List(CoreAttrs), List(HTML_Off_Form) content),
1740 h4 (List(CoreAttrs), List(HTML_Off_Form) content), 1751 h4 (List(CoreAttrs), List(HTML_Off_Form) content),
1741 h5 (List(CoreAttrs), List(HTML_Off_Form) content), 1752 h5 (List(CoreAttrs), List(HTML_Off_Form) content),
1742 - h6 (List(CoreAttrs), List(HTML_Off_Form) content) 1753 + h6 (List(CoreAttrs), List(HTML_Off_Form) content)
1743 . 1754 .
1744 1755
1745 'HTML_Off_Form' defines all the elements you may put outside any form. 1756 'HTML_Off_Form' defines all the elements you may put outside any form.
1746 1757
  1758 +public define HTML_Off_Form strong(HTML_Off_Form content) = strong([], [content]).
  1759 +public define HTML_Off_Form strong(List(HTML_Off_Form) content) = strong([], content).
  1760 +public define HTML_Off_Form strong(List(CoreAttrs) attrs, HTML_Off_Form content) = strong(attrs, [content]).
  1761 +
1747 public define HTML_Off_Form h1(HTML_Off_Form content) = h1([], [content]). 1762 public define HTML_Off_Form h1(HTML_Off_Form content) = h1([], [content]).
1748 public define HTML_Off_Form h1(List(HTML_Off_Form) content) = h1([], content). 1763 public define HTML_Off_Form h1(List(HTML_Off_Form) content) = h1([], content).
1749 public define HTML_Off_Form h1(List(CoreAttrs) attrs, HTML_Off_Form content) = h1(attrs, [content]). 1764 public define HTML_Off_Form h1(List(CoreAttrs) attrs, HTML_Off_Form content) = h1(attrs, [content]).
@@ -2434,6 +2449,7 @@ public type HTTP_Answer: @@ -2434,6 +2449,7 @@ public type HTTP_Answer:
2434 Printable_tree /*content*/), 2449 Printable_tree /*content*/),
2435 json (HTTP_Status, /*http_status*/ 2450 json (HTTP_Status, /*http_status*/
2436 JsonValue), /*json value*/ 2451 JsonValue), /*json value*/
  2452 + send_file (String file_path), //file to send to client. //TODO add call back for before, during, after send
2437 http_raw (Printable_tree), 2453 http_raw (Printable_tree),
2438 html_content (HTTP_Status /*http_status*/, 2454 html_content (HTTP_Status /*http_status*/,
2439 HTML_Off_Form), 2455 HTML_Off_Form),
@@ -3160,16 +3176,15 @@ public type CommonInfo: @@ -3160,16 +3176,15 @@ public type CommonInfo:
3160 3176
3161 We need a forward declaration. 3177 We need a forward declaration.
3162 3178
3163 -public define Printable_tree  
3164 - format  
3165 - (  
3166 - CommonInfo cinfo,  
3167 - //String state_name,  
3168 - List(HTTP_header) headers,  
3169 - HTTP_Answer page,  
3170 - Bool is_https,  
3171 - String charset  
3172 - ). 3179 +public define AWP_Handler_Answer
  3180 + format
  3181 + (
  3182 + CommonInfo cinfo,
  3183 + List(HTTP_header) headers,
  3184 + HTTP_Answer page,
  3185 + Bool is_https,
  3186 + String charset
  3187 + ).
3173 3188
3174 3189
3175 define Printable_tree 3190 define Printable_tree
@@ -3218,7 +3233,7 @@ public define Web_Site @@ -3218,7 +3233,7 @@ public define Web_Site
3218 List(Web_arg), 3233 List(Web_arg),
3219 Bool is_https) -> $State ticket_lost_state, 3234 Bool is_https) -> $State ticket_lost_state,
3220 List(Web_Action($State)) actions, 3235 List(Web_Action($State)) actions,
3221 - $State -> HTTP_Answer compute_page, 3236 + $State -> HTTP_Answer compute_page,
3222 $State -> List(HTTP_header) additional_headers, 3237 $State -> List(HTTP_header) additional_headers,
3223 Int timeout, 3238 Int timeout,
3224 Redirections redirections, 3239 Redirections redirections,
@@ -3256,7 +3271,6 @@ public define Web_Site @@ -3256,7 +3271,6 @@ public define Web_Site
3256 HTTP_Info http_info, 3271 HTTP_Info http_info,
3257 List(Web_arg) lwa, 3272 List(Web_arg) lwa,
3258 Bool is_https) |-> 3273 Bool is_https) |->
3259 - //(Printable_tree)  
3260 //println(dump_web_arg_values(lwa)); 3274 //println(dump_web_arg_values(lwa));
3261 since separate_web_args(lwa, http_info) is swa(mb_previous_state, mb_action_name, operands), 3275 since separate_web_args(lwa, http_info) is swa(mb_previous_state, mb_action_name, operands),
3262 with new_state = if mb_previous_state is 3276 with new_state = if mb_previous_state is
@@ -3300,7 +3314,6 @@ public define Web_Site @@ -3300,7 +3314,6 @@ public define Web_Site
3300 }, 3314 },
3301 3315
3302 format(info(host_name, http_port, https_port, site_directory, secret), 3316 format(info(host_name, http_port, https_port, site_directory, secret),
3303 - //state_name,  
3304 additional_headers(new_state) + cookie_headers, 3317 additional_headers(new_state) + cookie_headers,
3305 compute_page(new_state), 3318 compute_page(new_state),
3306 is_https, 3319 is_https,
@@ -3324,8 +3337,8 @@ public define Web_Site @@ -3324,8 +3337,8 @@ public define Web_Site
3324 journal_headers, 3337 journal_headers,
3325 secret, 3338 secret,
3326 known_mime_types, 3339 known_mime_types,
3327 - site_handler(http_port,https_port),  
3328 - (HTTP_Info http_info, List(Web_arg) lwa) |-> if separate_web_args(lwa, http_info ) is 3340 + site_handler(http_port, https_port),
  3341 + (HTTP_Info http_info, List(Web_arg) lwa) |-> if separate_web_args(lwa, http_info ) is
3329 swa(mb_previous_state,mb_action_name,operands) then 3342 swa(mb_previous_state,mb_action_name,operands) then
3330 if mb_action_name is 3343 if mb_action_name is
3331 { 3344 {
@@ -3539,7 +3552,7 @@ define (Maybe(WEB_Session), HTTP_Answer) @@ -3539,7 +3552,7 @@ define (Maybe(WEB_Session), HTTP_Answer)
3539 ajax(session, content, additional_script) then (success(session), json(http_ok, to_html_ajax_content(content, cinfo, additional_script))), 3552 ajax(session, content, additional_script) then (success(session), json(http_ok, to_html_ajax_content(content, cinfo, additional_script))),
3540 ajax(content, additional_script) then (failure, json(http_ok, to_html_ajax_content(content, additional_script))), 3553 ajax(content, additional_script) then (failure, json(http_ok, to_html_ajax_content(content, additional_script))),
3541 ajax(session, content, additional_script) then (success(session), json(http_ok, to_html_ajax_content(content, additional_script))), 3554 ajax(session, content, additional_script) then (success(session), json(http_ok, to_html_ajax_content(content, additional_script))),
3542 - 3555 + send_file(file_path) then (failure, send_file(file_path))
3543 } 3556 }
3544 } 3557 }
3545 . 3558 .
@@ -5810,6 +5823,8 @@ define Printable_tree @@ -5810,6 +5823,8 @@ define Printable_tree
5810 format(cinfo,ic_v,any_i(opts,t),format_element,is_https, action_count, head_tags), 5823 format(cinfo,ic_v,any_i(opts,t),format_element,is_https, action_count, head_tags),
5811 span(opts,t) then 5824 span(opts,t) then
5812 format(cinfo,ic_v,any_span(opts,t),format_element,is_https, action_count, head_tags), 5825 format(cinfo,ic_v,any_span(opts,t),format_element,is_https, action_count, head_tags),
  5826 + strong(opts, l) then ["<strong", format_attrs(opts), ">",flat(map(format_element,l)),"</strong>\n"],
  5827 +
5813 hr(opts) then 5828 hr(opts) then
5814 format(cinfo,ic_v,any_hr(opts),format_element,is_https, action_count, head_tags), 5829 format(cinfo,ic_v,any_hr(opts),format_element,is_https, action_count, head_tags),
5815 h1(opts, l) then ["<h1", format_attrs(opts), ">",flat(map(format_element,l)),"</h1>\n"], 5830 h1(opts, l) then ["<h1", format_attrs(opts), ">",flat(map(format_element,l)),"</h1>\n"],
@@ -6054,19 +6069,18 @@ public define JsonValue @@ -6054,19 +6069,18 @@ public define JsonValue
6054 ]) 6069 ])
6055 . 6070 .
6056 6071
6057 -public define Printable_tree  
6058 - format  
6059 - (  
6060 - CommonInfo cinfo,  
6061 - //String state_name,  
6062 - List(HTTP_header) additional_headers,  
6063 - HTTP_Answer page,  
6064 - Bool is_https,  
6065 - String charset  
6066 - ) =  
6067 - if cinfo is info(common_name,http_port,https_port,site_directory,secret) then  
6068 - with ic_v = var((Int)0),  
6069 - p_content_head_tags = var((List(HTML_Head_Tag))[]), //list of heat_tags extracted from partial_content during format of body content 6072 +public define AWP_Handler_Answer //Printable_tree
  6073 + format
  6074 + (
  6075 + CommonInfo cinfo,
  6076 + List(HTTP_header) additional_headers,
  6077 + HTTP_Answer page,
  6078 + Bool is_https,
  6079 + String charset
  6080 + )=
  6081 + if cinfo is info(common_name,http_port,https_port,site_directory,secret) then
  6082 + with ic_v = var((Int)0),
  6083 + p_content_head_tags = var((List(HTML_Head_Tag))[]), //list of heat_tags extracted from partial_content during format of body content
6070 if page is 6084 if page is
6071 { 6085 {
6072 html_page(status, head_tags, body) then 6086 html_page(status, head_tags, body) then
@@ -6085,15 +6099,16 @@ public define Printable_tree @@ -6085,15 +6099,16 @@ public define Printable_tree
6085 6099
6086 "<head>\n", format_html_head(head_tags + *p_content_head_tags, charset),"</head>\n", 6100 "<head>\n", format_html_head(head_tags + *p_content_head_tags, charset),"</head>\n",
6087 ], 6101 ],
6088 - [ "HTTP/1.1 " + status_string, crlf,  
6089 - format_headers(standard_headers), 6102 + printable_tree([
  6103 + "HTTP/1.1 " + status_string, crlf,
  6104 + format_headers(standard_headers),
6090 format_headers(standard_headers_for("text/html", length(answer_body_header) + length(answer_body_body), success(charset))), 6105 format_headers(standard_headers_for("text/html", length(answer_body_header) + length(answer_body_body), success(charset))),
6091 format_headers(status_headers), 6106 format_headers(status_headers),
6092 format_headers(additional_headers), 6107 format_headers(additional_headers),
6093 crlf, 6108 crlf,
6094 answer_body_header . 6109 answer_body_header .
6095 answer_body_body 6110 answer_body_body
6096 - ], 6111 + ]),
6097 6112
6098 html_page(status, title, metas, css_styles, css_files, js_files, script, body) then 6113 html_page(status, title, metas, css_styles, css_files, js_files, script, body) then
6099 if body is body(options,element) then 6114 if body is body(options,element) then
@@ -6130,41 +6145,45 @@ public define Printable_tree @@ -6130,41 +6145,45 @@ public define Printable_tree
6130 format_html_head(*p_content_head_tags, charset), 6145 format_html_head(*p_content_head_tags, charset),
6131 "</head>\n" 6146 "</head>\n"
6132 ], 6147 ],
6133 -  
6134 - [ "HTTP/1.1 " + status_string, crlf,  
6135 - format_headers(standard_headers),  
6136 - format_headers(standard_headers_for("text/html", length(answer_body_header) + length(answer_body_body), success(charset))),  
6137 - format_headers(status_headers),  
6138 - format_headers(additional_headers),  
6139 - crlf, 6148 + printable_tree([
  6149 + "HTTP/1.1 " + status_string, crlf,
  6150 + format_headers(standard_headers),
  6151 + format_headers(standard_headers_for("text/html", length(answer_body_header) + length(answer_body_body), success(charset))),
  6152 + format_headers(status_headers),
  6153 + format_headers(additional_headers),
  6154 + crlf,
6140 answer_body_header . 6155 answer_body_header .
6141 answer_body_body 6156 answer_body_body
6142 - ], 6157 + ]),
6143 6158
6144 plain_text (HTTP_Status status, String text) then 6159 plain_text (HTTP_Status status, String text) then
6145 if format(status) is (status_string, status_headers) then 6160 if format(status) is (status_string, status_headers) then
6146 - [ "HTTP/1.1 " + status_string, crlf, 6161 + printable_tree([
  6162 + "HTTP/1.1 " + status_string, crlf,
6147 format_headers(standard_headers), 6163 format_headers(standard_headers),
6148 format_headers(standard_headers_for("text/plain", length(text), success(charset))), 6164 format_headers(standard_headers_for("text/plain", length(text), success(charset))),
6149 format_headers(status_headers), 6165 format_headers(status_headers),
6150 format_headers(additional_headers), 6166 format_headers(additional_headers),
6151 crlf, 6167 crlf,
6152 text . (Printable_tree)[] 6168 text . (Printable_tree)[]
6153 - ], 6169 + ]),
6154 6170
6155 custom_text(HTTP_Status status, mime_type, String content) then 6171 custom_text(HTTP_Status status, mime_type, String content) then
6156 if format(status) is (status_string, status_headers) then 6172 if format(status) is (status_string, status_headers) then
6157 - [ "HTTP/1.1 " + status_string, crlf, 6173 + printable_tree([
  6174 + "HTTP/1.1 " + status_string, crlf,
6158 format_headers(standard_headers), 6175 format_headers(standard_headers),
6159 format_headers(standard_headers_for(to_String(mime_type), length(content), success(charset))), 6176 format_headers(standard_headers_for(to_String(mime_type), length(content), success(charset))),
6160 format_headers(status_headers), 6177 format_headers(status_headers),
6161 format_headers(additional_headers), 6178 format_headers(additional_headers),
6162 crlf, 6179 crlf,
6163 content . (Printable_tree)[] 6180 content . (Printable_tree)[]
6164 - ], 6181 + ]),
  6182 +
6165 custom_binary(HTTP_Status status, mime_type, ByteArray content, List(HTTP_header) other_headers) then 6183 custom_binary(HTTP_Status status, mime_type, ByteArray content, List(HTTP_header) other_headers) then
6166 if format(status) is (status_string, status_headers) then 6184 if format(status) is (status_string, status_headers) then
6167 - [ "HTTP/1.1 " + status_string, crlf, 6185 + printable_tree([
  6186 + "HTTP/1.1 " + status_string, crlf,
6168 format_headers(status_headers), 6187 format_headers(status_headers),
6169 format_headers(standard_headers_for(to_String(mime_type), length(content), failure)), 6188 format_headers(standard_headers_for(to_String(mime_type), length(content), failure)),
6170 format_headers(status_headers), 6189 format_headers(status_headers),
@@ -6172,44 +6191,53 @@ public define Printable_tree @@ -6172,44 +6191,53 @@ public define Printable_tree
6172 format_headers(additional_headers), 6191 format_headers(additional_headers),
6173 crlf, 6192 crlf,
6174 content . (Printable_tree)[] 6193 content . (Printable_tree)[]
6175 - ], 6194 + ]),
6176 6195
6177 custom_tree(HTTP_Status status, mime_type, Printable_tree content) then 6196 custom_tree(HTTP_Status status, mime_type, Printable_tree content) then
6178 - if format(status) is (status_string, status_headers) then  
6179 - [ "HTTP/1.1 " + status_string, crlf, 6197 + if format(status) is (status_string, status_headers) then
  6198 + printable_tree([
  6199 + "HTTP/1.1 " + status_string, crlf,
6180 format_headers(standard_headers), 6200 format_headers(standard_headers),
6181 format_headers(standard_headers_for(to_String(mime_type), length(content), success(charset))), 6201 format_headers(standard_headers_for(to_String(mime_type), length(content), success(charset))),
6182 format_headers(status_headers), 6202 format_headers(status_headers),
6183 format_headers(additional_headers), 6203 format_headers(additional_headers),
6184 crlf . 6204 crlf .
6185 content 6205 content
6186 - ], 6206 + ]),
  6207 +
6187 json(HTTP_Status status, JsonValue json_content) then 6208 json(HTTP_Status status, JsonValue json_content) then
6188 //with start = unow, 6209 //with start = unow,
6189 with content = (Printable_tree)format_json(json_content), 6210 with content = (Printable_tree)format_json(json_content),
6190 //println(show_duration_string("HTTP json format json object ", start)); 6211 //println(show_duration_string("HTTP json format json object ", start));
6191 if format(status) is (status_string, status_headers) then 6212 if format(status) is (status_string, status_headers) then
6192 - [ "HTTP/1.1 " + status_string, crlf,  
6193 - format_headers(standard_headers), 6213 + printable_tree([
  6214 + "HTTP/1.1 " + status_string, crlf,
  6215 + format_headers(standard_headers),
6194 format_headers(standard_headers_for(to_String(mime_json), length(content), success(charset))), 6216 format_headers(standard_headers_for(to_String(mime_json), length(content), success(charset))),
6195 format_headers(status_headers), 6217 format_headers(status_headers),
6196 format_headers(additional_headers), 6218 format_headers(additional_headers),
6197 crlf . 6219 crlf .
6198 content 6220 content
6199 - ],  
6200 - http_raw(Printable_tree content) then content, 6221 + ])
  6222 + ,
  6223 + send_file(file_path) then
  6224 + send_file(file_path),
  6225 +
  6226 + http_raw(Printable_tree content) then
  6227 + printable_tree(content),
6201 6228
6202 html_content(HTTP_Status status, HTML_Off_Form content_HTML) then 6229 html_content(HTTP_Status status, HTML_Off_Form content_HTML) then
6203 if format(status) is (status_string, status_headers) then 6230 if format(status) is (status_string, status_headers) then
6204 with content = format(cinfo, ic_v, content_HTML, is_https, var(0), p_content_head_tags), 6231 with content = format(cinfo, ic_v, content_HTML, is_https, var(0), p_content_head_tags),
6205 - [ "HTTP/1.1 " + status_string, crlf, 6232 + printable_tree([
  6233 + "HTTP/1.1 " + status_string, crlf,
6206 format_headers(standard_headers), 6234 format_headers(standard_headers),
6207 format_headers(standard_headers_for("text/html", length(content), success(charset))), 6235 format_headers(standard_headers_for("text/html", length(content), success(charset))),
6208 format_headers(status_headers), 6236 format_headers(status_headers),
6209 format_headers(additional_headers), 6237 format_headers(additional_headers),
6210 crlf . 6238 crlf .
6211 content 6239 content
6212 - ], 6240 + ]),
6213 //HMTL content with some header 6241 //HMTL content with some header
6214 html_partial_content(HTTP_Status status, HTML_Partial_Content p_content) then 6242 html_partial_content(HTTP_Status status, HTML_Partial_Content p_content) then
6215 6243
@@ -6225,7 +6253,8 @@ public define Printable_tree @@ -6225,7 +6253,8 @@ public define Printable_tree
6225 // html_header, 6253 // html_header,
6226 format_html_head(head_tags + *p_content_head_tags), 6254 format_html_head(head_tags + *p_content_head_tags),
6227 ], 6255 ],
6228 - [ "HTTP/1.1 " + status_string, crlf, 6256 + printable_tree([
  6257 + "HTTP/1.1 " + status_string, crlf,
6229 format_headers(standard_headers), 6258 format_headers(standard_headers),
6230 format_headers(standard_headers_for("text/html", length(answer_header) + length(answer_body), success(charset))), 6259 format_headers(standard_headers_for("text/html", length(answer_header) + length(answer_body), success(charset))),
6231 format_headers(status_headers), 6260 format_headers(status_headers),
@@ -6233,6 +6262,6 @@ public define Printable_tree @@ -6233,6 +6262,6 @@ public define Printable_tree
6233 crlf, 6262 crlf,
6234 answer_header . 6263 answer_header .
6235 answer_body 6264 answer_body
6236 - ], 6265 + ]),
6237 }. 6266 }.
6238 6267
web/CXM_multihost_http_server.anubis
@@ -188,6 +188,11 @@ read web/mime.anubis @@ -188,6 +188,11 @@ read web/mime.anubis
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 190
  191 +public type AWP_Handler_Answer:
  192 + printable_tree(Printable_tree p_tree),
  193 + send_file(String full_path)
  194 +.
  195 +
191 public type Web_Site_Description: 196 public type Web_Site_Description:
192 web_site_description( 197 web_site_description(
193 List(String) common_names, 198 List(String) common_names,
@@ -201,8 +206,7 @@ public type Web_Site_Description: @@ -201,8 +206,7 @@ public type Web_Site_Description:
201 (String host_name, 206 (String host_name,
202 HTTP_Info http_info, 207 HTTP_Info http_info,
203 List(Web_arg) lwa, 208 List(Web_arg) lwa,
204 - Bool is_https) -> (//List(HTTP_header),  
205 - Printable_tree) awp_handler, 209 + Bool is_https) -> AWP_Handler_Answer awp_handler,
206 (HTTP_Info http_info, 210 (HTTP_Info http_info,
207 List(Web_arg) lwa) -> One before_send_file 211 List(Web_arg) lwa) -> One before_send_file
208 //Bool using_state_cookies, 212 //Bool using_state_cookies,
@@ -2176,11 +2180,14 @@ define One @@ -2176,11 +2180,14 @@ define One
2176 Int sent, // bytes already sent 2180 Int sent, // bytes already sent
2177 String filename // name of file 2181 String filename // name of file
2178 ) = 2182 ) =
2179 - if sent >= size then unique else 2183 + if sent >= size then
  2184 + //TODO add call back on success if need
  2185 + unique
  2186 + else
2180 if read(file,min(65536,size-sent),60) is 2187 if read(file,min(65536,size-sent),60) is
2181 { 2188 {
2182 error then log_journal_msg(desc,"Cannot read from file '"+filename+"'.\n"), 2189 error then log_journal_msg(desc,"Cannot read from file '"+filename+"'.\n"),
2183 - timeout then log_journal_msg(desc,"Cannot read from file timeoput'"+filename+"'.\n"), 2190 + timeout then log_journal_msg(desc,"Cannot read from file timeout'"+filename+"'.\n"),
2184 ok(ba) then 2191 ok(ba) then
2185 with nr = length(ba), // get the number of bytes read 2192 with nr = length(ba), // get the number of bytes read
2186 if reliable_write(connection, ba) is 2193 if reliable_write(connection, ba) is
@@ -2226,17 +2233,18 @@ define One @@ -2226,17 +2233,18 @@ define One
2226 Connection connection, 2233 Connection connection,
2227 List(HTTP_header) input_headers, 2234 List(HTTP_header) input_headers,
2228 List(HTTP_header) headers, 2235 List(HTTP_header) headers,
2229 - Int size,  
2230 - Connection file,  
2231 - String filename,  
2232 - String full_path,  
2233 - MIME mime_type,  
2234 - One -> One action_before_send_file 2236 + Int size, // size of the file to send
  2237 + Connection file, // file to be sent already opened
  2238 + String filename, // name of file
  2239 + String full_path, // full path to the file (filename included)
  2240 + MIME mime_type, // mime type of the file
  2241 + One -> One action_before_send_file //call to execute before sending file
2235 ) = 2242 ) =
2236 action_before_send_file(unique); 2243 action_before_send_file(unique);
2237 with input_etag = http_header_value(input_headers, "If-None-Match"), 2244 with input_etag = http_header_value(input_headers, "If-None-Match"),
2238 mb_ftimes = get_file_times(full_path), 2245 mb_ftimes = get_file_times(full_path),
2239 - current_etag = compute_etag(full_path, mb_ftimes, size), 2246 + current_etag = compute_etag(full_path, mb_ftimes, size),
  2247 +
2240 if are_same_etag(input_etag, current_etag) is 2248 if are_same_etag(input_etag, current_etag) is
2241 { 2249 {
2242 false then 2250 false then
@@ -2272,7 +2280,7 @@ define Bool @@ -2272,7 +2280,7 @@ define Bool
2272 2280
2273 Before opening and sending a file, we check the MIME type. It must be recognized, 2281 Before opening and sending a file, we check the MIME type. It must be recognized,
2274 except if there is a valid authorization for private download. 2282 except if there is a valid authorization for private download.
2275 - 2283 +
2276 define One 2284 define One
2277 send_file 2285 send_file
2278 ( 2286 (
@@ -2350,6 +2358,43 @@ define One @@ -2350,6 +2358,43 @@ define One
2350 ) 2358 )
2351 else log_journal_msg(desc,"Cannot find or read authorization file.\n") 2359 else log_journal_msg(desc,"Cannot find or read authorization file.\n")
2352 }. 2360 }.
  2361 +
  2362 +define One
  2363 + send_file_answer
  2364 + (
  2365 + Web_Site_Description desc,
  2366 + Connection connection,
  2367 + String uri,
  2368 + String absolute_path,
  2369 + List(HTTP_header) input_headers,
  2370 + List(HTTP_header) output_headers,
  2371 + One -> One action_before_send_file
  2372 + )=
  2373 + if (Maybe(RStream))file(absolute_path, read) is
  2374 + {
  2375 + failure then
  2376 + println("HTTP/1.1 404 Not Found"+absolute_path);
  2377 + forget(reliable_write(connection,to_byte_array("HTTP/1.1 404 Not Found"+crlf+
  2378 + "Content-Length: 0"+crlf+crlf
  2379 + /*+"Connection: close"+crlf+crlf*/)));
  2380 + log_journal_msg(desc,"Cannot find file '"+absolute_path+"'.\n"),
  2381 + success(f) then
  2382 + with size = file_size(f),
  2383 + mime_type = mime("application", "octet-stream", []),
  2384 +
  2385 + send_file(
  2386 + desc,
  2387 + connection,
  2388 + input_headers,
  2389 + output_headers,
  2390 + size,
  2391 + file(f),
  2392 + uri,
  2393 + absolute_path,
  2394 + mime_type,
  2395 + action_before_send_file)
  2396 + }
  2397 +.
2353 2398
2354 *** [5.6] Answering a www-url encoded request. 2399 *** [5.6] Answering a www-url encoded request.
2355 2400
@@ -2410,14 +2455,15 @@ define One @@ -2410,14 +2455,15 @@ define One
2410 if is_illegal_uri(uri,0) 2455 if is_illegal_uri(uri,0)
2411 then log_journal_msg(desc,"Received illegal URI: "+uri+"\n") 2456 then log_journal_msg(desc,"Received illegal URI: "+uri+"\n")
2412 else (if (ext = ".awp" | ext = "") 2457 else (if (ext = ".awp" | ext = "")
2413 - then (with answer_headers_body = awp_handler(desc)(host_name,  
2414 - http_inf,  
2415 - all_web_args,  
2416 - is_SSL(connection)),  
2417 - //print_delta("After page generation");  
2418 - forget(reliable_write(connection, answer_headers_body))  
2419 - //print_delta("After sending page")  
2420 - ) 2458 + then
  2459 + if awp_handler(desc)(host_name, http_inf, all_web_args, is_SSL(connection)) is
  2460 + {
  2461 + printable_tree(answer_headers_body) then
  2462 + forget(reliable_write(connection, answer_headers_body)),
  2463 + send_file(file_path) then
  2464 + send_file_answer(desc, connection, uri, file_path, headers, standard_headers,
  2465 + (One u) |-> before_send_file(desc)(http_inf, all_web_args))
  2466 + }
2421 else (send_file(desc, 2467 else (send_file(desc,
2422 connection, 2468 connection,
2423 uri, 2469 uri,
@@ -2916,12 +2962,25 @@ define One @@ -2916,12 +2962,25 @@ define One
2916 if is_illegal_uri(uri,0) 2962 if is_illegal_uri(uri,0)
2917 then log_journal_msg(desc,"Received illegal URI: "+uri+"\n") 2963 then log_journal_msg(desc,"Received illegal URI: "+uri+"\n")
2918 else 2964 else
2919 - if (ext = ".awp" | ext = "") then  
2920 - (with answer_headers_body = awp_handler(desc)(host_name,  
2921 - http_info(ip_addr, host_name, uri, headers, is_SSL(connection)),  
2922 - all_web_args,  
2923 - is_SSL(connection)),  
2924 - forget(reliable_write(connection, answer_headers_body))) 2965 +// if (ext = ".awp" | ext = "") then
  2966 +// (with answer_headers_body = awp_handler(desc)(host_name,
  2967 +// http_info(ip_addr, host_name, uri, headers, is_SSL(connection)),
  2968 +// all_web_args,
  2969 +// is_SSL(connection)),
  2970 +// forget(reliable_write(connection, answer_headers_body)))
  2971 +
  2972 + if (ext = ".awp" | ext = "") then
  2973 + with http_inf = http_info(ip_addr, host_name, uri, headers, is_SSL(connection)),
  2974 + if awp_handler(desc)(host_name, http_inf, all_web_args, is_SSL(connection)) is
  2975 + {
  2976 + printable_tree(answer_headers_body) then
  2977 + forget(reliable_write(connection, answer_headers_body)),
  2978 + send_file(file_path) then
  2979 + send_file_answer(desc, connection, uri, file_path, headers, standard_headers,
  2980 + (One u) |-> before_send_file(desc)(http_inf, all_web_args))
  2981 + }
  2982 +
  2983 +
2925 else unique 2984 else unique
2926 }. 2985 }.
2927 2986
web/widgets/button.anubis
@@ -78,10 +78,18 @@ public define HTML_Partial_Content @@ -78,10 +78,18 @@ public define HTML_Partial_Content
78 img_button 78 img_button
79 ( 79 (
80 String img_path, 80 String img_path,
81 - WEB_Action_Name url, 81 + WEB_Action_Name web_action,
82 List((String, String)) extra_ops 82 List((String, String)) extra_ops
83 )= 83 )=
84 - img_button(img_path, [], same, url, extra_ops). 84 + img_button(img_path, [], same, web_action, extra_ops).
  85 +
  86 +public define HTML_Partial_Content
  87 + img_button
  88 + (
  89 + String img_path,
  90 + WEB_Action_Name web_action
  91 + )=
  92 + img_button(img_path, [], same, web_action, []).
85 93
86 public define HTML_Partial_Content 94 public define HTML_Partial_Content
87 img_button 95 img_button