Commit 1718a699c010470463df9498bac3ff72a559f409

Authored by Cédric RICARD
1 parent 912413bf

- 'shutdown' check has changed. Using a function instead a Boolean variable.

- HTTP redirect codes add needed 'Location' header.
calexium_lib/net_services/CXM_net_services.anubis
... ... @@ -172,9 +172,8 @@ define Server -> (RWStream) -> One
172 172 public define Maybe(Server)
173 173 start_net_services
174 174 (
175   - List(NetService) net_services,
176   - Word32 network_port,
177   - Var(Bool) shutdown_required
  175 + List(NetService) net_services,
  176 + Word32 network_port,
178 177 )=
179 178 if start_server(0,
180 179 network_port,
... ...
calexium_lib/web/CXM_making_a_web_site.anubis
... ... @@ -589,7 +589,7 @@ public define Start_Web_Sites_Result
589 589 Word32 https_port, // usually: 443
590 590 String ssl_certificate_common_name,
591 591 List(Web_Site) web_sites, // web sites to be started
592   - Var(Bool) shutdown_required
  592 + (One) -> Bool shutdown_required
593 593 ).
594 594  
595 595 'ip_address' is the IP address on which the two servers listen. If you put 0, the
... ... @@ -1894,9 +1894,9 @@ define One
1894 1894 Int next_time,
1895 1895 Server http_server,
1896 1896 Server https_server,
1897   - Var(Bool) shutdown_required
  1897 + (One) -> Bool shutdown_required
1898 1898 ) =
1899   - if *shutdown_required
  1899 + if shutdown_required(unique)
1900 1900 then (shutdown(http_server); shutdown(https_server))
1901 1901 else unique;
1902 1902 if (is_down(http_server) & is_down(https_server))
... ... @@ -2370,7 +2370,7 @@ public define Start_Web_Sites_Result
2370 2370 Word32 https_port, // usually: 443
2371 2371 String ssl_certificate_common_name,
2372 2372 List(Web_Site) web_sites, // web sites to be started
2373   - Var(Bool) shutdown_required
  2373 + (One) -> Bool shutdown_required
2374 2374 ) =
2375 2375 with get_description = (Web_Site ws) |-> description(ws)(http_port,https_port),
2376 2376 with http_server_r =
... ... @@ -2422,7 +2422,7 @@ public define One
2422 2422 Word32 https_port, // usually: 443
2423 2423 String ssl_certificate_common_name,
2424 2424 List(Web_Site) web_sites, // web sites to be started
2425   - Var(Bool) shutdown_required,
  2425 + (One) -> Bool shutdown_required,
2426 2426 Logger log
2427 2427 ) =
2428 2428 if (Start_Web_Sites_Result)start_web_sites(ip_address,
... ... @@ -4293,6 +4293,7 @@ define Printable_tree
4293 4293 {
4294 4294 html_page(status, title, metas, css_styles, css_files, js_files, body) then
4295 4295 if body is body(options,element) then
  4296 + if format(status) is (status_string, status_headers) then
4296 4297 with answer_body =
4297 4298 [ doctype_w3c_header,
4298 4299 html_header,
... ... @@ -4322,35 +4323,42 @@ define Printable_tree
4322 4323 "</body>\n",
4323 4324 "</html>"
4324 4325 ],
4325   - [ "HTTP/1.1 " + format(status), crlf,
  4326 + [ "HTTP/1.1 " + status_string, crlf,
4326 4327 format_headers(standard_headers),
4327 4328 format_headers(standard_headers_for("text/html", length(answer_body), success(charset))),
  4329 + format_headers(status_headers),
4328 4330 format_headers(additional_headers),
4329 4331 crlf
4330 4332 . answer_body
4331 4333 ],
4332 4334  
4333 4335 plain_text (HTTP_Status status, String text) then
4334   - [ "HTTP/1.1 " + format(status), crlf,
  4336 + if format(status) is (status_string, status_headers) then
  4337 + [ "HTTP/1.1 " + status_string, crlf,
4335 4338 format_headers(standard_headers),
4336 4339 format_headers(standard_headers_for("text/plain", length(text), success(charset))),
  4340 + format_headers(status_headers),
4337 4341 format_headers(additional_headers),
4338 4342 crlf,
4339 4343 text . (Printable_tree)[]
4340 4344 ],
4341 4345  
4342 4346 custom_text(HTTP_Status status, String mime_type, String content) then
4343   - [ "HTTP/1.1 " + format(status), crlf,
  4347 + if format(status) is (status_string, status_headers) then
  4348 + [ "HTTP/1.1 " + status_string, crlf,
4344 4349 format_headers(standard_headers),
4345 4350 format_headers(standard_headers_for(mime_type, length(content), success(charset))),
  4351 + format_headers(status_headers),
4346 4352 format_headers(additional_headers),
4347 4353 crlf,
4348 4354 content . (Printable_tree)[]
4349 4355 ],
4350 4356 custom_binary(HTTP_Status status, String mime_type, ByteArray content, List(HTTP_header) other_headers) then
4351   - [ "HTTP/1.1 " + format(status), crlf,
4352   - format_headers(standard_headers),
  4357 + if format(status) is (status_string, status_headers) then
  4358 + [ "HTTP/1.1 " + status_string, crlf,
  4359 + format_headers(status_headers),
4353 4360 format_headers(standard_headers_for(mime_type, length(content), failure)),
  4361 + format_headers(status_headers),
4354 4362 format_headers(other_headers),
4355 4363 format_headers(additional_headers),
4356 4364 crlf,
... ... @@ -4358,9 +4366,11 @@ define Printable_tree
4358 4366 ],
4359 4367  
4360 4368 custom_tree(HTTP_Status status, String mime_type, Printable_tree content) then
4361   - [ "HTTP/1.1 " + format(status), crlf,
  4369 + if format(status) is (status_string, status_headers) then
  4370 + [ "HTTP/1.1 " + status_string, crlf,
4362 4371 format_headers(standard_headers),
4363 4372 format_headers(standard_headers_for(mime_type, length(content), success(charset))),
  4373 + format_headers(status_headers),
4364 4374 format_headers(additional_headers),
4365 4375 crlf .
4366 4376 content
... ... @@ -4369,10 +4379,12 @@ define Printable_tree
4369 4379 http_raw(Printable_tree content) then content,
4370 4380  
4371 4381 html_content(HTTP_Status status, HTML_Off_Form content_HTML) then
4372   - with content = format(cinfo, state_name, ic_v, content_HTML, is_https),
4373   - [ "HTTP/1.1 " + format(status), crlf,
  4382 + if format(status) is (status_string, status_headers) then
  4383 + with content = format(cinfo, state_name, ic_v, content_HTML, is_https),
  4384 + [ "HTTP/1.1 " + status_string, crlf,
4374 4385 format_headers(standard_headers),
4375 4386 format_headers(standard_headers_for("text/html", length(content), success(charset))),
  4387 + format_headers(status_headers),
4376 4388 format_headers(additional_headers),
4377 4389 crlf .
4378 4390 content
... ...
calexium_lib/web/CXM_multihost_http_server.anubis
... ... @@ -182,9 +182,11 @@ read CXM_mime.anubis
182 182 public type HTTP_Info:
183 183 http_info
184 184 (
185   - Word32 ip_address, // IP address of the client
  185 + Word32 ip_address, // IP address of the client
  186 + String hostname, // hostname requested by the client
186 187 String uri, // URI requested by the client
187 188 List(HTTP_header) http_headers, // HTTP headers sent by the client
  189 + Bool is_https,
188 190 One -> String generate_trust_ticket // may be used against denial of
189 191 // service attacks
190 192 ).
... ... @@ -500,12 +502,12 @@ public type HTTP_Status:
500 502 http_partial_content,
501 503  
502 504 http_multiple_choices,
503   - http_moved_permanently,
504   - http_moved_temporarily,
505   - http_see_other,
  505 + http_moved_permanently(String location),
  506 + http_moved_temporarily(String location),
  507 + http_see_other(String location),
506 508 http_not_modified,
507   - http_use_proxy,
508   - http_temporary_redirect,
  509 + http_use_proxy(String location),
  510 + http_temporary_redirect(String location),
509 511  
510 512 http_bad_request,
511 513 http_unauthorized,
... ... @@ -535,7 +537,7 @@ public type HTTP_Status:
535 537  
536 538 http_error(Int /*code*/, String /*message*/).
537 539  
538   -public define String
  540 +public define (String, List(HTTP_header))
539 541 format
540 542 (
541 543 HTTP_Status status
... ... @@ -2357,7 +2359,7 @@ define One
2357 2359 then log_journal_msg(desc,"Received illegal URI: "+uri+"\n")
2358 2360 else (if (ext = ".awp" | ext = "")
2359 2361 then (with answer_headers_body = awp_handler(desc)(host_name,
2360   - http_info(ip_addr,uri,headers,generate_tt),
  2362 + http_info(ip_addr, host_name, uri, headers, is_SSL(connection), generate_tt),
2361 2363 all_web_args,
2362 2364 is_SSL(connection)),
2363 2365 //print_delta("After page generation");
... ... @@ -2808,7 +2810,7 @@ define One
2808 2810 else
2809 2811 if (ext = ".awp" | ext = "") then
2810 2812 (with answer_headers_body = awp_handler(desc)(host_name,
2811   - http_info(ip_addr,uri,headers,generate_tt),
  2813 + http_info(ip_addr, host_name, uri, headers, is_SSL(connection), generate_tt),
2812 2814 all_web_args,
2813 2815 is_SSL(connection)),
2814 2816 forget(reliable_write(connection, answer_headers_body)))
... ... @@ -3930,59 +3932,59 @@ global define One
3930 3932  
3931 3933  
3932 3934  
3933   -public define String
  3935 +public define (String, List(HTTP_header))
3934 3936 format
3935 3937 (
3936 3938 HTTP_Status status
3937 3939 ) =
3938 3940 if status is
3939 3941 {
3940   - http_continue then "100 Continue",
3941   - http_switching_protocol then "101 Switching Protocols",
  3942 + http_continue then ("100 Continue", []),
  3943 + http_switching_protocol then ("101 Switching Protocols", []),
3942 3944  
3943   - http_ok then "200 OK",
3944   - http_created then "201 Created",
3945   - http_accepted then "202 Accepted",
3946   - http_non_authoritative_info then "203 Non-Authoritative Information",
3947   - http_no_content then "204 No Content",
3948   - http_reset_content then "205 Reset Content",
3949   - http_partial_content then "206 Partial Content",
  3945 + http_ok then ("200 OK", []),
  3946 + http_created then ("201 Created", []),
  3947 + http_accepted then ("202 Accepted", []),
  3948 + http_non_authoritative_info then ("203 Non-Authoritative Information", []),
  3949 + http_no_content then ("204 No Content", []),
  3950 + http_reset_content then ("205 Reset Content", []),
  3951 + http_partial_content then ("206 Partial Content", []),
3950 3952  
3951   - http_multiple_choices then "300 Multiple Choices",
3952   - http_moved_permanently then "301 Moved Permanently",
3953   - http_moved_temporarily then "302 Moved Temporarily",
3954   - http_see_other then "303 See Other",
3955   - http_not_modified then "304 Not Modified",
3956   - http_use_proxy then "305 Use Proxy",
3957   - http_temporary_redirect then "307 Temporary Redirect",
  3953 + http_multiple_choices then ("300 Multiple Choices", []),
  3954 + http_moved_permanently(loc) then ("301 Moved Permanently", [http_header("Location", loc)]),
  3955 + http_moved_temporarily(loc) then ("302 Moved Temporarily", [http_header("Location", loc)]),
  3956 + http_see_other(loc) then ("303 See Other", [http_header("Location", loc)]),
  3957 + http_not_modified then ("304 Not Modified", []),
  3958 + http_use_proxy(loc) then ("305 Use Proxy", [http_header("Location", loc)]),
  3959 + http_temporary_redirect(loc) then ("307 Temporary Redirect", [http_header("Location", loc)]),
3958 3960  
3959   - http_bad_request then "400 Bad Request",
3960   - http_unauthorized then "401 Unauthorized",
3961   - http_payment_required then "402 Payment Required",
3962   - http_forbidden then "403 Forbidden",
3963   - http_not_found then "404 Not Found",
3964   - http_method_not_allowed then "405 Method Not Allowed",
3965   - http_not_acceptable then "406 Not Acceptable",
3966   - http_proxy_authentification_required then "407 Proxy Authentication Required",
3967   - http_request_timeout then "408 Request Time-out",
3968   - http_conflict then "409 Conflict",
3969   - http_gone then "410 Gone",
3970   - http_length_required then "411 Length Required",
3971   - http_precondition_failed then "412 Precondition Failed",
3972   - http_request_entity_too_large then "413 Request Entity Too Large",
3973   - http_request_uri_too_long then "414 Request-URI Too Long",
3974   - http_unsupported_media_type then "415 Unsupported Media Type",
3975   - http_request_range_unsatisfiable then "416 Requested range unsatisfiable",
3976   - http_expectation_failed then "417 Expectation failed",
  3961 + http_bad_request then ("400 Bad Request", []),
  3962 + http_unauthorized then ("401 Unauthorized", []),
  3963 + http_payment_required then ("402 Payment Required", []),
  3964 + http_forbidden then ("403 Forbidden", []),
  3965 + http_not_found then ("404 Not Found", []),
  3966 + http_method_not_allowed then ("405 Method Not Allowed", []),
  3967 + http_not_acceptable then ("406 Not Acceptable", []),
  3968 + http_proxy_authentification_required then ("407 Proxy Authentication Required", []),
  3969 + http_request_timeout then ("408 Request Time-out", []),
  3970 + http_conflict then ("409 Conflict", []),
  3971 + http_gone then ("410 Gone", []),
  3972 + http_length_required then ("411 Length Required", []),
  3973 + http_precondition_failed then ("412 Precondition Failed", []),
  3974 + http_request_entity_too_large then ("413 Request Entity Too Large", []),
  3975 + http_request_uri_too_long then ("414 Request-URI Too Long", []),
  3976 + http_unsupported_media_type then ("415 Unsupported Media Type", []),
  3977 + http_request_range_unsatisfiable then ("416 Requested range unsatisfiable", []),
  3978 + http_expectation_failed then ("417 Expectation failed", []),
3977 3979  
3978   - http_internal_server_error then "500 Internal Server Error",
3979   - http_not_implemented then "501 Not Implemented",
3980   - http_bad_gateway then "502 Bad Gateway",
3981   - http_service_unavailable then "503 Service Unavailable",
3982   - http_gateway_timeout then "504 Gateway Time-out",
3983   - http_version_not_supported then "505 HTTP Version not supported",
  3980 + http_internal_server_error then ("500 Internal Server Error", []),
  3981 + http_not_implemented then ("501 Not Implemented", []),
  3982 + http_bad_gateway then ("502 Bad Gateway", []),
  3983 + http_service_unavailable then ("503 Service Unavailable", []),
  3984 + http_gateway_timeout then ("504 Gateway Time-out", []),
  3985 + http_version_not_supported then ("505 HTTP Version not supported", []),
3984 3986  
3985   - http_error(code, message) then abs_to_decimal(code) + " " + message
  3987 + http_error(code, message) then (abs_to_decimal(code) + " " + message, [])
3986 3988 }.
3987 3989  
3988 3990  
... ...