From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: HTTP with Simple Components: Status.Kind always File
Date: Mon, 17 Jul 2017 22:59:32 +0200
Date: 2017-07-17T22:59:32+02:00 [thread overview]
Message-ID: <okj8fj$8ue$1@gioia.aioe.org> (raw)
In-Reply-To: <2017071720305687401-contact@flyx.org>
On 2017-07-17 20:30, Felix Krause wrote:
> I am trying to implement an HTTP server with Simple Components. My
> problem is that whenever I send a request to the server, in Do_Get,
> Status.Kind is File instead of URI. Relevant parts of my code:
>
> package Yaml.Servers is
> package HTTP renames
> GNAT.Sockets.Connection_State_Machine.HTTP_Server;
> package Server renames GNAT.Sockets.Server;
>
> type Yaml_Factory (Request_Length : Positive;
> Input_Size : Server.Buffer_Length;
> Output_Size : Server.Buffer_Length;
> Max_Connections : Positive) is
> new Server.Connections_Factory with null record;
>
> type Yaml_Client is new HTTP.HTTP_Client with null record;
>
> overriding function Create (Factory : access Yaml_Factory;
> Listener : access
> Server.Connections_Server'Class;
> From : GNAT.Sockets.Sock_Addr_Type)
> return Server.Connection_Ptr is
> (new Yaml_Client (Listener =>
> Listener.all'Unchecked_Access,
> Request_Length => Factory.Request_Length,
> Input_Size => Factory.Input_Size,
> Output_Size => Factory.Output_Size));
>
> overriding procedure Do_Get (Client : in out Yaml_Client);
> end Yaml.Servers;
>
> package body Yaml.Servers is
> procedure Do_Get (Client : in out Yaml_Client) is
> Status : HTTP.Status_Line renames Get_Status_Line (Client);
> begin
> case Status.Kind is
> when HTTP.None =>
> ...
> when HTTP.File =>
> ...
> when HTTP.URI =>
> ...
> end case;
> end Do_Get;
> end Yaml.Servers;
>
> procedure Yaml.Server is
> Factory : aliased Servers.Yaml_Factory (200, 80, 8192, 100);
> Server : Servers.Server.Connections_Server (Factory'Access, 8088);
> pragma Unreferenced (Server);
> begin
> Ada.Text_IO.Put_Line ("HTTP server started.");
> loop
> delay 60.0;
> end loop;
> end Yaml.Server;
>
> Now I run this server behind an nginx, and it responds as expected.
> However, when I access it with an URI `http://ada.yaml.io/widget/`,
> inside Do_Get, Status.Kind is File. Why is this? With the File kind, I
> cannot possibly parse the query at this point, because I cannot
> differentiate between `%26` and `&` (entities have already been resolved).
>
> I also tested this locally with `http://localhost:8888/widget/`, and
> that also yields a file.
>
> How can I make the HTTP server to yield an URI instead of a File?
If I correctly understand the issue, the HTTP request line must contain
a schema.
If you take a look into the source, parsing gets the method (e.g. GET)
then it checks (gnat-sockets-connection_state_machine-http_server.adb,
1540):
if Request (Pointer) = '*' then
...
elsif Request (Pointer) = '/' then
...
else
...
end if;
The first does nothing, the second creates Kind => File, the third
creates Kind => URI. So Kind = File should be when the request like
looked like:
GET /something/somewhere...
URI when:
GET http://www.something/somewhere...
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
next prev parent reply other threads:[~2017-07-17 20:59 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-17 18:30 HTTP with Simple Components: Status.Kind always File Felix Krause
2017-07-17 20:59 ` Dmitry A. Kazakov [this message]
2017-07-19 16:09 ` Felix Krause
2017-07-19 16:33 ` Dmitry A. Kazakov
2017-07-19 19:31 ` Randy Brukardt
2017-07-19 21:13 ` Felix Krause
2017-07-20 8:57 ` Dmitry A. Kazakov
2017-07-20 13:35 ` Felix Krause
2017-07-20 13:57 ` Dmitry A. Kazakov
2017-07-20 14:19 ` Felix Krause
2017-07-20 20:29 ` Simon Wright
2017-07-20 20:57 ` Dmitry A. Kazakov
2017-07-20 21:12 ` Felix Krause
2017-07-21 7:14 ` Dmitry A. Kazakov
2017-07-21 7:06 ` Simon Wright
2017-07-21 7:15 ` Dmitry A. Kazakov
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox