diff options
Diffstat (limited to 'captain/web.f90')
-rw-r--r-- | captain/web.f90 | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/captain/web.f90 b/captain/web.f90 new file mode 100644 index 0000000..0899159 --- /dev/null +++ b/captain/web.f90 @@ -0,0 +1,108 @@ +module web +implicit none + + private + + public :: handle_request + + integer, parameter::REQUEST_UNKNOWN = 0 + integer, parameter::REQUEST_GET = 1 + integer, parameter::REQUEST_POST = 2 + +contains + + function method() + use utilities, only: toupper + implicit none + + integer::method + character(4)::method_text + + call get_environment_variable("REQUEST_METHOD", method_text) + call toupper(method_text) + if(trim(method_text) == "GET") then + method = REQUEST_GET + else if(method_text == "POST") then + method = REQUEST_POST + else + method = REQUEST_UNKNOWN + end if + + end function method + + subroutine build_request_object(req) + use server_response, only:request + + type(request), intent(out)::req + character(len=:), allocatable::url, script_name + integer::url_size + + call get_environment_variable("REQUEST_URI", length=url_size) + allocate(character(len=url_size)::url, script_name) + call get_environment_variable("REQUEST_URI", url) + call get_environment_variable("SCRIPT_NAME", script_name) + + ! If we're in CGI mode, treat the "server" as the script name + call req%init(url, server_explicit=script_name, protocol_explicit="http") + + deallocate(url) + deallocate(script_name) + + end subroutine build_request_object + + function request_templated(req) result(resp) + use server_response, only:request, response + implicit none + + type(request), intent(in)::req + type(response)::resp + + + + end function request_templated + + subroutine handle_request() + use server_response, only:request, response + use logging + use request_utils + use http + use iso_fortran_env, only: output_unit + use utilities, only: echo_file_stdout + implicit none + + type(request)::req + type(response)::resp + integer::response_size + + call build_request_object(req) + + if(is_request_static(req)) then + call write_log("Req static", LOG_INFO) + resp = request_static(req) + + else + call write_log("Req template", LOG_INFO) + resp = request_templated(req) + + end if + + ! Perform the response + select case(resp%code) + case(HTTP_CODE_REDIRECT) + call write_redirect(output_unit, resp%code, trim(resp%url)) + + case(HTTP_CODE_SUCCESS) + inquire(file=resp%body_filename, size=response_size) + call write_response_headers(output_unit, resp%code, response_size, trim(resp%body_mimetype)) + call echo_file_stdout(resp%body_filename) + + ! Need some more... + + end select + + call resp%destroy() + call req%destroy() + + end subroutine handle_request + +end module web |