module gemini_protocol implicit none integer, parameter::STATUS_INPUT = 1 integer, parameter::STATUS_SUCCESS = 2 integer, parameter::STATUS_REDIRECT = 3 integer, parameter::STATUS_TEMPFAIL = 4 integer, parameter::STATUS_PERMFAIL = 5 integer, parameter::STATUS_CERTREQ = 6 integer, parameter::STATUS_LOCALFAIL = -1 integer, parameter::BUFFER_SIZE = 256 contains function request_url(url, unit_number, server_name) result(returncode) use request use iso_c_binding use file_handling, only: mark_file_end implicit none character(*), intent(in)::url integer, intent(in)::unit_number character(*), intent(in), optional::server_name integer::returncode character(:), allocatable::server type(connection)::conn integer::bytes_received, i character, dimension(BUFFER_SIZE)::buffer returncode = -1 rewind(unit_number) if(present(server_name)) then allocate(character(len=len_trim(server_name)) :: server) server = server_name else server = get_server_from_url(url) end if conn = open_connection(server) if(conn%code == CONNECTION_OPEN) then if(send_string(conn%ssl, url//c_carriage_return//c_new_line, trimming=.false.)) then bytes_received = retrieve_characters(conn%ssl, buffer) Print *, bytes_received do while(bytes_received > 0) do i=1, bytes_received write(unit_number, '(A1)', advance='no') buffer(i) end do bytes_received = retrieve_characters(conn%ssl, buffer) end do call mark_file_end(unit_number) rewind(unit_number) read(unit_number, '(I1)') returncode else returncode = -1 write(unit_number, *) "Send Error: Could Not Send Request" write(*, *) "Send Error: Could Not Send Request" end if else returncode = -1 write(unit_number, *) "Connection Error: "//trim(translate_connection_code(conn%code)) write(*, *) "Connection Error: "//trim(translate_connection_code(conn%code)) end if call close_connection(conn) end function request_url subroutine get_redirect_url(unit_number, url) implicit none integer, intent(in)::unit_number character(*), intent(inout)::url character::search integer::i, istat rewind(unit_number) ! Status code read(unit_number, '(A1)', advance='no') search read(unit_number, '(A1)', advance='no') search ! Clear the url url = repeat(" ", len(url)) ! At least one whitespace, but whatever... read(unit_number, '(A1)', advance='no') search do while(search == " " .or. search == CHAR(9)) read(unit_number, '(A1)', advance='no', iostat=istat) search end do ! Now search contains our first url component i = 0 do while(search /= CHAR(13) .and. i < len(url) .and. istat == 0) i = i + 1 url(i:i) = search read(unit_number, '(A1)', advance='no', iostat=istat) search end do end subroutine get_redirect_url end module gemini_protocol