aboutsummaryrefslogtreecommitdiff
path: root/captain/web.f90
diff options
context:
space:
mode:
authorJeffrey Armstrong <jeff@approximatrix.com>2021-05-04 16:44:20 -0400
committerJeffrey Armstrong <jeff@approximatrix.com>2021-05-04 16:44:20 -0400
commit877b8876b078c8ab2632c17ab09e0ac0c2789c8a (patch)
treeba63e85cdaaef78aedc006854125312ff6607b21 /captain/web.f90
parente789ce4a4bc1f0894a707d2a141bbf357e0ba2d5 (diff)
downloadlevitating-877b8876b078c8ab2632c17ab09e0ac0c2789c8a.tar.gz
levitating-877b8876b078c8ab2632c17ab09e0ac0c2789c8a.zip
Initial work on the CGI interface for web access.
Diffstat (limited to 'captain/web.f90')
-rw-r--r--captain/web.f90108
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