Italian community of Lazarus and Free Pascal

Programmazione => Lazarus e il web => Topic aperto da: SB - Luglio 13, 2018, 07:52:25 am

Titolo: https server
Inserito da: SB - Luglio 13, 2018, 07:52:25 am
Prendo spunto da un'altra discussione...
Vorrei realizzare una applicazione standalone che funzioni come web server in rete locale, per offrire servizi via chiamate https (senza interfaccia) e con interfaccia via browser svincolandosi dalla GUI tradizionale.
Quale libreria consigliereste in FreePascal/Lazarus?
Meglio se fosse disponibile sia per Windows che per Linux.
Serve che gestisca il protocollo https
Multithread
Free
Ovviamente deve essere stabile, ben testata, sicura. Non mi interessano soluzioni in fasi di sviluppo.

Vedo che ci sono:
Indy (per quanto ne so orientata a Delphi/Windows, com'è il porting per FreePascal e Linux?)
Brook (che a qualcuno qui piace poco)

Altre alternative?
 
Titolo: Re:https server
Inserito da: xinyiman - Luglio 13, 2018, 08:13:47 am
Che io sappia che permette l'https c'è solo Indy. Altrimenti potresti fare come ho fatto io. Un server http standard di lazarus (testato con linux, windows e mac) che riceve i dati con chiamate di tipo get e i parametri sono cifrati, e restituisce solo json rigorosamente tutto cifrato. Lo so non è una cifratura a chiave asimmetrica ma almeno è più semplice da gestire e se usi un algoritmo abbastanza robusto aes128, aes256, io ho usato un mix tra blowfish e aes128 (doppia cifratura) dovresti dormire abbastanza tranquillo.
Titolo: Re:https server
Inserito da: SB - Luglio 13, 2018, 08:41:30 am
Pensavo all'https per offrire una interfaccia tramite browser (eventualmente accessibile anche da remoto)
L'altra soluzione proposta è interessante, ma richiederebbe un client apposito. Per curiosità, che libreria useresti in questo caso?

Dunque Indy, versione 10 che dovrebbe essere prevista anche per FreePascal
Provo e vi faccio sapere

Se nel frattempo avete altri suggerimenti...
Titolo: Re:https server
Inserito da: xinyiman - Luglio 13, 2018, 08:44:00 am
Si si per il mio progetto ho usato un client apposito. Anche perchè avevo necessità di generare dei servizi attraverso delle api, e non tutto il sito web. Per la crittografia ho usato dcpcrypt
Titolo: Re:https server
Inserito da: SB - Luglio 13, 2018, 08:47:23 am
e per il server http cosa hai usato? lo hai fatto multithread per gestire chiamate contemporanee?
Titolo: Re:https server
Inserito da: xinyiman - Luglio 13, 2018, 09:03:52 am
Questo per iniziare dovrebbe andare bene
https://www.freepascal.org/~michael/articles/webserver1/webserver1.pdf
Titolo: Re:https server
Inserito da: SB - Luglio 13, 2018, 09:09:18 am
Grazie! Adesso me lo leggo
Titolo: Re:https server
Inserito da: nomorelogic - Luglio 13, 2018, 11:50:36 am
[...]
Vorrei realizzare una applicazione standalone che funzioni come web server in rete locale, per offrire servizi via chiamate https
[...]
Altre alternative?

usare apache (o altro web server) e realizzare dei moduli con lazarus?
così l'https lo lasci gestire al web server
Titolo: Re:https server
Inserito da: Stilgar - Luglio 13, 2018, 12:49:07 pm
Ciao SB.Https, ti serve veramente?Altrimenti una cosina del tipo :) ?
Codice: [Seleziona]
interface

uses
  Classes, SysUtils, custhttpapp, fphttpapp, httproute, HTTPDefs, fpjson, fpjsonrtti, om;

type
  { TFakeJsonServer }

  TFakeJsonServer = class(TCustomHTTPApplication)
  public
    procedure Initialize; override;
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
    function getMethod(aMethodString: string): TRouteMethod;
  protected
    procedure Process1(ARequest: TRequest; AResponse: TResponse);
    procedure Response404(ARequest: TRequest; AResponse: TResponse);
  end;

var
  Application: TFakeJsonServer;
  ShowCleanUpErrors: boolean = False;

implementation

uses
  CustApp, jsonparser;

{ TFakeJsonServer }

constructor TFakeJsonServer.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
end;

destructor TFakeJsonServer.Destroy;
begin
  inherited Destroy;
end;

function TFakeJsonServer.getMethod(aMethodString: string): TRouteMethod;
begin
  aMethodString := upperCase(aMethodString);
  if aMethodString = 'GET' then
    exit(rmGet)
  else if aMethodString = 'POST' then
    exit(rmPost)
  else if aMethodString = 'PUT' then
    exit(rmPut)
  else if aMethodString = 'OPTIONS' then
    exit(rmOptions)
  else if aMethodString = 'HEAD' then
    exit(rmHead)
  else if aMethodString = 'TRACE' then
    exit(rmTrace)
  else
    exit(rmAll);
end;

procedure TFakeJsonServer.Process1(ARequest: TRequest; AResponse: TResponse);
var
  Parameters: TStringList;
  r: THTTPRoute;
  index: integer;
  aName, aValue: string;
begin
  Parameters := TStringList.Create;
  try
    r := httprouter.GetHTTPRoute(ARequest.URL, getMethod(ARequest.Method), Parameters);
    if r <> nil then
    begin
      for index := 0 to Parameters.Count - 1 do
      begin
        Parameters.GetNameValue(index, aName, aValue);
        Writeln(index, ':', aName, '->', aValue);
      end;
    end;
  except
    on e: Exception do
    begin
      Writeln(e.Message);
    end;
  end;
  FreeAndNil(Parameters);
end;

procedure TFakeJsonServer.Response404(ARequest: TRequest; AResponse: TResponse);
begin
  AResponse.Content := '{ status :400 }';
end;


procedure TFakeJsonServer.Initialize;
begin
  inherited Initialize;
    RedirectOnError := True;    Application.Threaded := True;
    Application.Port := 0000; // quella che vuoi
    HTTPRouter.RegisterRoute('url1',getMethod('get'), @Process1);
    HTTPRouter.RegisterRoute('url2',getMethod('delete'), @Process2);
    HTTPRouter.RegisterRoute('url3',getMethod('post'), @Process3);
end;


procedure InitHTTP;
begin
  Application := TFakeJsonServer.Create(nil);
  if not assigned(CustomApplication) then
    CustomApplication := Application;
end;

procedure DoneHTTP;
begin
  if CustomApplication = Application then
    CustomApplication := nil;
  try
    FreeAndNil(Application);
  except
    if ShowCleanUpErrors then
      raise;
  end;
end;

initialization
  InitHTTP;

finalization
  DoneHTTP;

end.       
Titolo: Re:https server
Inserito da: Stilgar - Luglio 13, 2018, 12:50:11 pm
ah e :
Codice: [Seleziona]
begin
  Application.Title := 'FakeJSonServer';
  Application.Initialize;
  Application.StopOnException := False;
  WriteLn('Accept request on port :', Application.Port);
  Application.Run;
  Application.Free;
end.
       
Titolo: Re:https server
Inserito da: SB - Luglio 13, 2018, 03:55:58 pm
Grazie, ma volevo provare a realizzare una applicazione server web che gestisca https (se si deve fare una cosa facciamola bene...) da usare in rete locale. Vorrei provare a svincolarmi dalle GUI specifiche di sistema e utilizzare una interfaccia "universale".
La cosa complicata è fare in modo che l'applicazione sia compilabile sia sotto Windows che sotto Linux, eventualmente con piccole modifiche.
Ho provato alcune librerie, ma su Linux finora non sono riuscito ad ottenere niente di funzionante.
Non sono riuscito a far funzionare nemmeno le Indy10 che teoricamente dovrebbero andar bene anche per Linux. Sembra tutto predisposto solo per Windows.

Titolo: Re:https server
Inserito da: SB - Luglio 13, 2018, 04:16:36 pm
Sia con Indy che con Synapse ho lo stesso errore... nella creazione di un thread
E' un po' sospetta questa cosa...
Titolo: Re:https server
Inserito da: Stilgar - Luglio 13, 2018, 04:20:02 pm
Prova il codice che ti ho postato.Se anche quello ti da problemi ... :|
Titolo: Re:https server
Inserito da: SB - Luglio 13, 2018, 06:30:56 pm
Il tuo codice sembra funzionare, con qualche modifica.
Ho risolto l'errore sui thread. Mi ero dimenticato che in Linux la cthread va messa come prima unit inclusa del progetto.
Però adesso mi danno altri errori, sia synapse che Indy, di segmentation fault...
Titolo: Re:https server
Inserito da: Diego1981 - Agosto 29, 2018, 09:10:26 am
Ciao SB
scusa se mi intrometto, ma sei poi riuscito?
Io ho usato synapse come libreria ma non riesco ad utilizzare l' HTTPS, fuziona solamente con L'HTTP
grazie
Diego
Titolo: Re:https server
Inserito da: Stilgar - Agosto 29, 2018, 09:32:57 am
Già.  Come  è finita?
Titolo: Re:https server
Inserito da: SB - Agosto 29, 2018, 11:55:29 am
Allora... ho provato Synapse e Indy su Linux e Windows.
Da impazzire. Gli esempi inclusi non funzionano e le indicazioni che ho trovato erano vecchie o scorrette.
Alla fine l'unica cosa che ha funzionato è Indy sotto Windows seguendo le indicazioni trovate in questa pagina:
https://synaptica.info/en/2016/09/21/build-your-own-https-server-with-delphi/
Mi sono fermato al restituire una paginetta.

Titolo: Re:https server
Inserito da: Stilgar - Agosto 29, 2018, 12:12:54 pm
Quindi hai abbandonato fp-web? :(Peccato.A me sta dando soddisfazioni.Leggevo che basta mettere una libreria dinamica dove è presente l'esegubile (per Windows) e importare un unit per rendero https. Ma non ho ancora avuto modo di testarlo ;)
Titolo: Re:https server
Inserito da: Stilgar - Agosto 29, 2018, 12:14:57 pm
Controlla https://github.com/paxtibi/jsonserver, magari puoi trovare qualche idea utile.Qui il progetto si basa su un file di configurazione che definisce gli end point.Se li metti nel codice ti eviti la lettura del file di configurazione. ;)Solo per esempio e per lavorare con le request/response ;)
Stilgar
Titolo: Re:https server
Inserito da: Diego1981 - Agosto 29, 2018, 12:41:31 pm
Anche io ho visto la pagina web di synapse dove dicono che in tre righe passa da http a hhtps ma non riesco proprio
per il resto il multithred funziona, almeno a me  ;D
Titolo: Re:https server
Inserito da: SB - Agosto 30, 2018, 06:43:45 am
Quindi hai abbandonato fp-web? :(Peccato.A me sta dando soddisfazioni.Leggevo che basta mettere una libreria dinamica dove è presente l'esegubile (per Windows) e importare un unit per rendero https. Ma non ho ancora avuto modo di testarlo ;)
Non ho provato, ma, se non ho capito male, fp-web permette di realizzare moduli per Apache. Se è così, la gestione dell'https dovrebbe essere compito di Apache, quindi immagino che non ci siano problemi.
L'idea era quella di realizzare una applicazione stand-alone a interfaccia web. Non vorrei che ci si dovesse appoggiare a web server su cui probabilmente non si ha alcun controllo o autorizzazione di accesso (e che vanno installati, configurati, mantenuti, ecc).
Titolo: Re:https server
Inserito da: SB - Agosto 30, 2018, 06:45:57 am
Controlla https://github.com/paxtibi/jsonserver, magari puoi trovare qualche idea utile.Qui il progetto si basa su un file di configurazione che definisce gli end point.Se li metti nel codice ti eviti la lettura del file di configurazione. ;)Solo per esempio e per lavorare con le request/response ;)
Stilgar
Se è per lavorare con request/response non ho problemi. Ho già un mio framework CGI funzionante.
Comunque grazie, proverò a guardare cosa fanno.
Titolo: Re:https server
Inserito da: SB - Agosto 30, 2018, 07:14:23 am
Anche io ho visto la pagina web di synapse dove dicono che in tre righe passa da http a hhtps ma non riesco proprio
per il resto il multithred funziona, almeno a me  ;D
Tra il dire e il fare c'è di mezzo... un bel po' di smanettamento...
Non metto in dubbio la buona volontà di chi porta avanti lo sviluppo di certi progetti open source, ma a volte mi chiedo se non siano un po' troppo presuntuosi.
Raramente mi capita di scaricare qualcosa che funzioni subito come ci si aspetta.
Può essere che sia dovuto alla mia incapacità, inesperienza o altro, oppure faccio cose talmente particolari che a nessun altro è venuto in mente di provare, ma a me non funziona.
Non pretendo che le librerie open source siano esenti da errori, ma mi aspetto quanto meno che librerie, esempi e documentazione siano allineati, con almeno gli esempi funzionanti.
Se si dichiara che funzionano su Linux mi aspetto che qualcuno abbia provato su una macchina Linux, senza particolari configurazioni, e abbia visto coi propri occhi che funziona.
Se una particolare libreria richiede particolari configurazioni lo si dica chiaramente.
Invece siamo qui a chiederci quali saranno mai quelle benedette tre righe che fanno funzionare synapse in https



Titolo: Re:https server
Inserito da: Stilgar - Agosto 30, 2018, 08:05:20 am
Sb.
I moduli apache sono un aspetto di fpweb.
Un altro aspetto è la classe thttpclient.

Il progetto che ti ho indicato è configurabile e lavora sulla porta che trova indicata nel file.  Poi risponde alle chiamate http in modo autonomo. Non usa apache.

L'ho messo in parallelo ad apache . Quando arrivano delle chiamate (ad apache) di cui i colleghi non mi hanno ancora fornito la parte server (dovrei chiamare weblogic da apache) interviene questo software per restituire dei dati fake tanto per continuare a sviluppare la parte web per il cliente.
Implementa un sistema rudimentale di ricerca dentro i json con i dati statici.

Stilgar
Titolo: Re:https server
Inserito da: nomorelogic - Agosto 30, 2018, 03:14:42 pm
c'è speranza che diventi un server rest/json autonomo adatto alla produzione? :)
Titolo: Re:https server
Inserito da: Stilgar - Agosto 30, 2018, 03:36:02 pm
Non credo.  ;D Esula dagli scopi che mi ero profisso :) ;)
Stilgar
Titolo: Re:https server
Inserito da: nomorelogic - Agosto 30, 2018, 03:37:57 pm
come multithread com'è messo?
Titolo: Re:https server
Inserito da: Stilgar - Agosto 30, 2018, 03:46:10 pm
Da https://github.com/paxtibi/jsonserver/blob/master/src/app.pas (https://github.com/paxtibi/jsonserver/blob/master/src/app.pas)


Codice: [Seleziona]
procedure TFakeJsonServer.Initialize;
var
  FileStream: TFileStream;
  DeStreamer: TJSONDeStreamer;
  c: TCollectionItem;
  r: TRouterObject;
  jsonData: TJSONStringType;
  handle: TRouter;
begin
  inherited Initialize;
  Application.Threaded := True;
  RedirectOnError := True;
  FileStream := TFileStream.Create('config.json', fmOpenRead);
  SetLength(jsonData, FileStream.Size);
  FileStream.Read(jsonData[1], FileStream.Size);
  Writeln(jsonData);
  DeStreamer := TJSONDeStreamer.Create(nil);
  try...
Titolo: Re:https server
Inserito da: nomorelogic - Agosto 30, 2018, 05:29:38 pm
ah vedo che eredita da TCustomHTTPApplication

Codice: [Seleziona]
TFakeJsonServer = class(TCustomHTTPApplication)

allora il multithreading dovrebbe essere affidabile :)
Titolo: Re:https server
Inserito da: Stilgar - Agosto 30, 2018, 05:37:20 pm
ops.Mi hai scoperto :)
Titolo: Re:https server
Inserito da: Diego1981 - Settembre 06, 2018, 07:58:09 am
Ciao SB
forse ci sono riuscito con synapse almeno sembra  ;D, dopo le eccezioni dei browser e del Kaspersky il lucchetto di firefox è verde
ho guardato la guida di synapse qui: http://www.ararat.cz/synapse/doku.php/public:howto:httpsserver
io ho utilizzato i file pfx( quelle pem non riesco a farli funzionare)

e ho generato con openssl il certificato seguendo questa pagina: https://github.com/Azure/azure-xplat-cli/wiki/Getting-Self-Signed-SSL-Certificates-(.pem-and-.pfx)

e dalla LAN funziona tutto, i browser dicono che la connessione è cifrata (a parte android  :()

spero possa darti una mano
ciuz


Titolo: Re:https server
Inserito da: nomorelogic - Settembre 06, 2018, 08:57:36 am
sarebbe molto bello se il codice fosse pubblicabile  ;D ;D
Titolo: Re:https server
Inserito da: SB - Settembre 11, 2018, 08:48:27 am
...
forse ci sono riuscito con synapse almeno sembra  ;D
...
 i browser dicono che la connessione è cifrata (a parte android  :()
...

Bene, un passo avanti!
Sotto Windows o Linux?
Usi Chrome, Firefox o altro? (dovrebbe essere indifferente, ma il fatto che su Android non funziona mi insospettisce...)
Titolo: Re:https server
Inserito da: Diego1981 - Settembre 30, 2018, 06:05:44 pm
Ciao SB
scusa ma il lavoro mi sta distruggendo  :o :o
ho provato con firefox ed explorer mentre andorid l'ho provato dal cellulare ma quello continua chiedermi di confermare l'eccezione
Tutto sotto windows 8.1