如何在 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 服务器功能。
我正在尝试使用 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 服务器功能。