From be976a38f1d95258f19d94f4cf5dc4c677041ed9 Mon Sep 17 00:00:00 2001 From: Jeffrey Armstrong Date: Mon, 29 Mar 2021 16:38:00 -0400 Subject: Changed how temp files work on UNIX-y stuff. Fixed templates, which were quite broken. --- captain/gemini.f90 | 83 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 75 insertions(+), 8 deletions(-) (limited to 'captain/gemini.f90') 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 -- cgit v1.2.3