如何在 lazarus 中使用 synapse 创建 https 服务器

How can create https server using synapse in lazarus

我正在尝试使用 synapse 在 lazarus 中创建 https 服务器,但我失败了。我想让我的服务器从其他 https 客户端接收数据。 我正在使用 https://localhost:1500 通过我的浏览器发送请求,我的服务器正在接收信号。但是当我尝试读取发送的数据时,我什么也没收到。当我测试简单的 http 服务器时,一切正常。但是现在在 https 的情况下它不起作用。我正在使用 ubuntu 15.04 作为我的 OS

s := ASocket.RecvString(超时); //returns 没有

我的示例代码:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

uses
  blcksock, sockets, Synautil, ssl_openssl, ssl_openssl_lib;

procedure AttendConnection(ASocket: TTCPBlockSocket);
var
  timeout: integer;
  s: string;
  method, uri, protocol: string;
  OutputDataString: string;
  ResultCode: integer;
begin
  timeout := 1000;

  WriteLn('Received headers+document from browser:');

  //read request line
  s := ASocket.RecvString(timeout);
  WriteLn(s);
  method := fetch(s, ' ');
  uri := fetch(s, ' ');
  protocol := fetch(s, ' ');

  //read request headers
  repeat
    s := ASocket.RecvString(Timeout);
    WriteLn(s);
  until s = '';

  // Now write the document to the output stream

  if uri = '/' then
  begin
    // Write the output document to the stream
    OutputDataString :=
      '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'
      + ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' + CRLF
      + '<html><h1>Teste</h1></html>' + CRLF;

    // Write the headers back to the client
    ASocket.SendString('HTTP/1.0 200' + CRLF);
    ASocket.SendString('Content-type: Text/Html' + CRLF);
    ASocket.SendString('Content-length: ' + IntTostr(Length(OutputDataString)) + CRLF);
    ASocket.SendString('Connection: close' + CRLF);
    ASocket.SendString('Date: ' + Rfc822DateTime(now) + CRLF);
    ASocket.SendString('Server: Servidor do Felipe usando Synapse' + CRLF);
    ASocket.SendString('' + CRLF);

  //  if ASocket.lasterror <> 0 then HandleError;

    // Write the document back to the browser
    ASocket.SendString(OutputDataString);
  end
  else
    ASocket.SendString('HTTP/1.0 404' + CRLF);
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  ListenerSocket, ConnectionSocket: TTCPBlockSocket;
begin
  ListenerSocket := TTCPBlockSocket.Create;
  ConnectionSocket := TTCPBlockSocket.Create;

  ListenerSocket.CreateSocket;
  ListenerSocket.SSL.CertificateFile := '/home/imants/projects/apps/medieval/bin/40669199_localhost_8080.cert';
  ListenerSocket.SSL.PrivateKeyFile := '/home/imants/projects/apps/medieval/bin/40669199_localhost_8080.key';
  ListenerSocket.SSLDoConnect;
  ListenerSocket.setLinger(true,10);
  ListenerSocket.bind('localhost','1500');
  ListenerSocket.listen;

  repeat
    if ListenerSocket.canread(1000) then
    begin
      ConnectionSocket.Socket := ListenerSocket.accept;
      WriteLn('Attending Connection. Error code (0=Success): ', ConnectionSocket.lasterror);
      AttendConnection(ConnectionSocket);
      ConnectionSocket.CloseSocket;
    end;
  until false;

  ListenerSocket.Free;
  ConnectionSocket.Free;
end;

end.

我知道您想使用 Synapse,但您可能想看看 Indy。多年来,我一直在使用 Indy 开发 server/client 应用程序,我喜欢它。它在 windows 和 linux(32 位、64 位、arm...)上运行良好,并且具有一些不错的功能。您可以使用 TIdHTTPServer 组件。此外获得 IOHandlerSSLOpenSSL。事件 OnCommandGet(AContext: TIdContext; ARequestInfo:TIdHTTPRequestInfo; AResponseInfo:TIdHTTPResponseInfo)是最重要的一个。它允许访问请求(如 A ARequestInfo.Document)和您的 HTTP 响应 (AResponseInfo)。

据我所知,有两个来源,其中有一个 Synapse 中的 HTTP(s) 服务器示例。

第一个示例位于该页面的 Synapse stable package (release 40). Although I would recommend you use the SVN version (you can use the Download Snapshot 按钮中)您仍然可以使用 "release 40 package".

中的示例

synapse40\source\demo\httpsserv 中的示例应该可用作 HTTPS 服务器。如果不是,您可以使用 httpserv (HTTP) 示例并将其更改为 shown here。 (但我认为 httpsserv 与那些修改是一样的)

如果您使用的是 Linux (Lazarus),则需要将每次出现的 winsock 更改为 synsock 并删除任何 windows 子句。

另一个例子可以是 found here. (Direct download of SynHttp.zip) 据我所知它也有 HTTPS 服务器功能。