我使用Perl 6的cro创建了一个存根服务,但由于"不支持ALPN"而导致错误.
$ cro stub http ds4 ds4
Stubbing a HTTP Service 'ds4' in 'ds4'...
First, please provide a little more information.
Secure (HTTPS) (yes/no) [no]: yes
Support HTTP/1.1 (yes/no) [yes]:
Support HTTP/2.0 (yes/no) [yes]:
Support Web Sockets (yes/no) [no]: yes
$ cd ds4
$ cro run
? Starting ds4 (ds4)
Endpoint HTTPS will be at https://localhost:20000/
? Restarting ds4 (ds4)
? ds4 HTTP/2 is requested, but ALPN is not supported
? ds4 in method new at /home/zoffix/rakudo/install/share/perl6/site/sources/D142088174DCE80630FC7C31793703D9D56E26D6 (Cro::HTTP::Server) line …Run Code Online (Sandbox Code Playgroud) 我正在尝试组合一个具有反应/whenever 块在“后台”消费数据的 Cro 服务。因此,与许多使用 Cro 的 websocket 使用示例不同,这与可以通过浏览器访问的路由无关。
我的用例是使用通过 MQTT 主题接收的消息并对其进行一些处理。在开发的后期阶段,我可能会从这些数据中创建一个供应,但是现在,当接收到数据时,它将存储在一个变量中并取决于某些条件,通过 http post 发送到另一个服务。
我的想法是provider()在Cro::HTTP::Server设置中包含一个,如下所示:
use Cro::HTTP::Log::File;
use Cro::HTTP::Server;
use Routes;
use DataProvider; # Here
my Cro::Service $http = Cro::HTTP::Server.new(
http => <1.1>,
host => ...,
port => ...,
application => [routes(), provider()], # Made this into an array of subs?
after => [
Cro::HTTP::Log::File.new(logs => $*OUT, errors => $*ERR)
]
);
Run Code Online (Sandbox Code Playgroud)
在 DataProvider.pm6 中:
use MQTT::Client;
sub provider() is export {
my $mqtt = MQTT::Client.new: …Run Code Online (Sandbox Code Playgroud) 我无法理解supply {\xe2\x80\xa6}区块/它们创建的按需供应的用途。
Live supplies (that is, the types that come from a Supplier and get new values whenever that Supplier emits a value) make sense to me \xe2\x80\x93 they\'re a version of asynchronous streams that I can use to broadcast a message from one or more senders to one or more receivers. It\'s easy to see use cases for responding to a live stream of messages: I might want to take an action every time I get …
我对 Cro 如何处理客户端请求感到有点困惑,特别是为什么某些请求似乎会导致 Cro 的内存使用量激增。
\n一个最小的例子出现在字面上的“Hello world!”中。克罗服务器。
\nuse Cro::HTTP::Router;\nuse Cro::HTTP::Server;\n\nmy $application = route {\n get -> {\n content \'text/html\', \'Hello Cro!\';\n }\n}\n\nmy Cro::Service $service = Cro::HTTP::Server.new:\n :host<localhost>, :port<10000>, :$application;\n\n$service.start;\n\nreact whenever signal(SIGINT) {\n $service.stop;\n exit;\n}\nRun Code Online (Sandbox Code Playgroud)\n该服务器所做的就是用“Hello Cro!\”\xe2\x80\x93 响应 GET 请求,这当然不应该是繁重的。但是,如果我导航到页面localhost:10000然后快速刷新页面,我会注意到 Cro\'内存使用量开始攀升(然后保持较高水平)。
这种情况似乎只在刷新很快时才会发生,这表明该问题可能与未正确关闭连接或并发问题有关(可能与之前的问题略有相关)。
\n为了简单起见,这个“Hello world”服务器是否省略了一些性能技术或最佳实践?或者我是否遗漏了有关 Cro 设计工作方式的其他信息?
\n我正在使用HTTP路由非常成功地使用Cro HTTP身份验证/授权/会话.
然后我添加了一个创建web-socket使用的路由,Cro::HTTP::Router::WebSocket我可以连接到它,Cro::WebSocket::Client一切正常.
现在我想控制对websocket的访问,所以我添加了一个Cro::HTTP::Auth参数.效果很好.现在客户端获得了401 Unauthorized预期的结果.
下一步,我该如何开门?
有了Cro::HTTP::Client,我可以传入Authorization标题,甚至传递auth选项.我该怎么做Cro::WebSocket::Client?
我对WebSocket很新,所以我甚至不知道这是否是这样做的正确方法,但似乎该Cro::WebSocket::Client connect方法应该采用一个headers命名选项来获取传递的额外标题.
我想在前端Web服务器后面运行perl6 / raku Cro应用程序作为服务。
cro runsegfaults和重新启动后,仅运行将无法处理重新启动。
以前,在perl5中我使用过FastCGI-但是Cro::HTTP::Server的Cro::HTTP::Server.new().start()习惯用法似乎与FastCGI :: Native的while $fcgi.accept() {}示例不兼容。
由service.p6生成的cro stub确实具有SIGINT处理程序,但是我不确定这是否足以在systemctl服务中指向它,即
[Service]
ExecStart = /path/to/service.p6
Run Code Online (Sandbox Code Playgroud)
人们目前如何托管Cro应用程序?
我正在使用一个相当大的 Cro 应用程序,其中包含数十条路线、模型和其他逻辑。目前每个路由块中都有一个CATCH处理异常的方法。这对维护来说不太友好,更不用说添加它们的工作了。所以,我想知道这是否是更好的方法。主路由块中的一个CATCH处理程序不起作用。异常仅在抛出异常的路由块中捕获。可能是线程问题。是否有一个地方可以实现一个异常处理程序,它可以获取所有异常并可以在不导致应用程序终止的情况下处理它们?
简而言之:我使用 Cro 和 websocket 在互联网服务器上创建了一项服务。使用 Cro 示例非常简单。当页面作为本地主机时,从 HTML 页面发送和接收数据时没有问题。当使用 https 提供页面时,无法建立 websocket。wss协议如何与Cro一起使用?
更新:安装cro并运行后cro stub :secure,service.p6 还有一些文档中未明确的代码。
更多详细信息:我有一个在互联网服务器上运行的 docker 文件,Cro 设置为侦听 35145,因此 docker 命令是docker --rm -t myApp -p 35145:35145
服务文件包含
use Cro::HTTP::Log::File;
use Cro::HTTP::Server;
use Cro::HTTP::Router;
use Cro::HTTP::Router::WebSocket;
my $host = %*ENV<RAKU_WEB_REPL_HOST> // '0.0.0.0';
my $port = %*ENV<RAKU_WEB_REPL_PORT> // 35145;
my Cro::Service $http = Cro::HTTP::Server.new(
http => <1.1>,
:$host,
:$port,
application => routes(),
after => [
Cro::HTTP::Log::File.new(logs => $*OUT, errors => $*ERR)
] …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个简单的解决方案来保护我的路线与基本认证机制与Cro.在我的例子中,我想看看401 Unauthorized如果你根本不提供任何凭据.如果您提供错误的凭据,我希望看到一个403 Forbidden
在我的代码示例中,我从未看到MyBasicAuth被调用的中间件:
class MyUser does Cro::HTTP::Auth {
has $.username;
}
subset LoggedInUser of MyUser where { .username.defined }
class MyBasicAuth does Cro::HTTP::Auth::Basic[MyUser, "username"] {
method authenticate(Str $user, Str $pass --> Bool) {
# No, don't actually do this!
say "authentication called";
my $success = $user eq 'admin' && $pass eq 'secret';
forbidden without $success;
return $success
}
}
sub routes() is export {
my %storage;
route {
before MyBasicAuth.new;
post -> LoggedInUser $user, …Run Code Online (Sandbox Code Playgroud) 我在Windows 7上运行Rakudo Star 2019.03.1,Cro由安装zef。按照Cro网站上的“ 入门”部分,以下内容应适用:
cro stub命令可为您生成存根服务,以更快地启动并具有更好的默认值。在这里,我们使用它来创建一个简单的HTTP服务,其ID为hello并位于hello目录中:
cro stub http hello hello
...实际上确实有效,它会为项目生成许多文件,包括该.cro.yml文件,我认为这是该服务的中央描述文件。但是,如果我尝试遵循文档并运行cro run(hello我假设是从目录内部):
cro run命令将启动您的服务(如果更改文件,则会自动重新启动服务):
cro run
...该服务未启动但cro出现错误:
A react block:
in sub run-services at C:\rakudo\share\perl6\site\sources\709F4B18755ADE6922C88B8C44A0930A5DDD77C9 (Cro::Tools::CLI) line 227
in sub MAIN at C:\rakudo\share\perl6\site\sources\709F4B18755ADE6922C88B8C44A0930A5DDD77C9 (Cro::Tools::CLI) line 199
in block <unit> at C:\rakudo\share\perl6\site\resources\C1E87B0F084684C12CD87240AE4C12E746174570 line 1
in sub MAIN at C:\rakudo\share\perl6\site\bin\cro line 3
in block <unit> at C:\rakudo\share\perl6\site\bin\cro line 1
Died because of the exception:
no such file …Run Code Online (Sandbox Code Playgroud)