aboutsummaryrefslogtreecommitdiff
path: root/captain/gemini.f90
diff options
context:
space:
mode:
authorJeffrey Armstrong <jeff@approximatrix.com>2021-03-29 16:38:00 -0400
committerJeffrey Armstrong <jeff@approximatrix.com>2021-03-29 16:38:00 -0400
commitbe976a38f1d95258f19d94f4cf5dc4c677041ed9 (patch)
treedf8557c3d44c6dc41a29f34646d5d231d6075270 /captain/gemini.f90
parent7614a6244d080b8c0f82da8c34ccf7a4a88fe72a (diff)
downloadlevitating-be976a38f1d95258f19d94f4cf5dc4c677041ed9.tar.gz
levitating-be976a38f1d95258f19d94f4cf5dc4c677041ed9.zip
Changed how temp files work on UNIX-y stuff. Fixed templates, which were quite broken.
Diffstat (limited to 'captain/gemini.f90')
-rw-r--r--captain/gemini.f9083
1 files changed, 75 insertions, 8 deletions
diff --git a/captain/gemini.f90 b/captain/gemini.f90
index 31b1deb..841bcc4 100644
--- a/captain/gemini.f90
+++ b/captain/gemini.f90
@@ -1,8 +1,34 @@
module gemini
implicit none
+ private
+
+ public :: handle_request
+
contains
+ subroutine simplify_request(full_request, local_request)
+ use logging, only: write_log
+ implicit none
+
+ character(*), intent(in)::full_request
+ character(*), intent(out)::local_request
+
+ integer::i, j
+
+ ! Get the file of interest
+ i = index(full_request, "://")
+ if(i <= 0) then
+ local_request = full_request
+ else
+ j = index(full_request(i+3:len_trim(full_request)), "/")
+ local_request = full_request((i+j+2):len_trim(full_request))
+ end if
+
+ call write_log("Simplified Local Request: "//trim(local_request))
+
+ end subroutine simplify_request
+
subroutine read_request(ssl, req)
use jessl, only: ssl_read
use iso_c_binding
@@ -70,6 +96,7 @@ contains
subroutine write_file(ssl, unit_number, mimetype)
use iso_c_binding, only: c_ptr, c_carriage_return, c_new_line
use jessl, only: ssl_write
+ use logging
implicit none
type(c_ptr)::ssl
@@ -87,6 +114,28 @@ contains
end do
end subroutine write_file
+
+ subroutine write_string(ssl, string)
+ use jessl, only: ssl_write
+ use iso_c_binding, only: c_ptr
+ implicit none
+
+ type(c_ptr)::ssl
+ character(*)::string
+ character, dimension(:), allocatable::buf
+ integer::i
+
+ allocate(buf(len(string)))
+
+ do i = 1, len(string)
+ buf(i) = string(i:i)
+ end do
+
+ i = ssl_write(ssl, buf)
+
+ deallocate(buf)
+
+ end subroutine write_string
subroutine handle_request()
use jessl
@@ -94,6 +143,7 @@ contains
use config
use iso_fortran_env
use external_handling, only: external_request_gemini
+ use logging, only: write_log
implicit none
! For our TLS connection
@@ -103,13 +153,17 @@ contains
integer(kind=c_long)::res
! Requested file
- character(1024)::request
+ character(1024)::request, local_request
character(512)::mimetype
+
+ character(len=:), pointer::filename_ptr
- integer::rendered_unit
+ integer::rendered_unit, ioerror
call library_init()
+ filename_ptr => null()
+
method = tls_server_method()
ctx = ctx_new(method)
@@ -167,20 +221,33 @@ contains
call read_request(ssl, request)
call write_log("Request is "//trim(request))
+
+ call simplify_request(request, local_request)
- if(len_trim(request) .ge. 4) then
- if(request(1:4) == '/api') then
+ if(len_trim(local_request) .ge. 4) then
+ if(local_request(1:4) == '/api') then
!call handle_api_request(request)
else
- rendered_unit = external_request_gemini(request)
+ filename_ptr => external_request_gemini(local_request)
end if
else
- rendered_unit = external_request_gemini(request)
+ filename_ptr => external_request_gemini(local_request)
end if
- call write_file(ssl, rendered_unit, "text/gemini")
+ if(associated(filename_ptr)) then
+ open(newunit=rendered_unit, file=trim(filename_ptr), status="old", &
+ form="unformatted", iostat=ioerror, access="stream")
+
+ call write_log("transferring "//trim(filename_ptr))
+ call write_file(ssl, rendered_unit, "text/gemini")
- close(rendered_unit)
+ close(rendered_unit)
+
+ if(filename_ptr(1:5) == '/tmp/') then
+ call unlink(filename_ptr)
+ end if
+ deallocate(filename_ptr)
+ end if
end subroutine handle_request