具有Crystal的WEBrick之类的服务器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有Crystal的WEBrick之类的服务器相关的知识,希望对你有一定的参考价值。

是否有可能使用Crystal创建一个简单的Web服务器来提供html,CSS和JS页面?

我当前的代码是:

require "http/server"
Port = 8080
Mime = "text/html"

server = HTTP::Server.new([HTTP::ErrorHandler.new, HTTP::LogHandler.new]) do |context|
    req = context.request
    if req.method == "GET"
        filename = File.join(Dir.current, "index.html")
        context.response.content_type = Mime
        context.response.content_length = File.size(filename)
        File.open(filename) { |file| IO.copy(file, context.response) }
        next
    end
    context.response.content_type = Mime

end

puts "e[1;33mStarted Listening on Port #{Port}e[0m"
server.listen(Port)

当我运行编译并运行程序时,它将初始化服务器,但是有两个问题:

  1. 在Firefox浏览器的“检查元素”控制台中,我看到:
The stylesheet http://127.0.0.1:8080/styling.css was not loaded because its MIME type, "text/html", is not "text/css". 127.0.0.1:8080

The script from “http://127.0.0.1:8080/javascript.js” was loaded even though its MIME type (“text/html”) is not a valid JavaScript MIME type. 127.0.0.1:8080

SyntaxError: expected expression, got '<' javascript.js:1

服务器仅显示index.html的内容。

当我使用WEBrick运行或将index.html直接加载到浏览器时,HTML,CSS和JS代码完全有效。

  1. 无法从本地网络上的任何其他设备访问我的服务器。
答案

您可能要为此使用HTTP::StaticFileHandler。它提供本地目录中的文件。

  1. 在处理程序中,无论请求是什么,您总是读取文件HTTP::StaticFileHandler。这是行不通的。
  2. index.html侦听HTTP::Server#listen,因此只能从localhost使用。为了可以从网络访问,您需要侦听网络上可用的地址。例如,HTTP::Server#listen将在所有接口上监听。
另一答案

非常感谢@JohannesMüller解决了我的问题。这正是我想要的

代码:

127.0.0.1

此代码在提供的路径(默认Dir.current)中查找“ index.html”文件,如果找到,它将与IP地址(默认0.0.0.0)和端口(默认8080)共享index.html文件。提供,否则它仅共享当前目录内容。

正在运行:

server.listen("0.0.0.0", Port)

这些选项可以改组。例如:

#!/usr/bin/env crystal
require "http/server"

# Get the Address
ADDR = (ARGV.find { |x| x.split(".").size == 4 } || "0.0.0.0").tap { |x| ARGV.delete(x) }
        .split(".").map { |x| x.to_i { 0 } }.join(".")

# Get the Port
PORT = ARGV.find { |x| x.to_i { 0 } > 0 }.tap { |x| ARGV.delete(x) }.to_s.to_i { 8080 }

# Get the path
d = Dir.current
dir = ARGV[0] rescue d
path = Dir.exists?(dir) ? dir : Dir.exists?(File.join(d, dir)) ? File.join(d, dir) : d
listing = !!Dir.children(path).find { |x| x == "index.html" }
actual_path = listing ? File.join(path, "index.html") : path

server = HTTP::Server.new([
        HTTP::ErrorHandler.new,
        HTTP::LogHandler.new,
        HTTP::StaticFileHandler.new(path, directory_listing: !listing)
    ]) do |context|
        context.response.content_type = "text/html"
        File.open(actual_path) { |file| IO.copy(file, context.response) }
end

puts "e[1;33m:: Starting Sharing e[38;5;75m#{actual_path}e[1;31m on e[38;5;226mhttp://#{ADDR}:#{PORT}e[0m"
server.listen(::ADDR, ::PORT)

crystal [build] code.cr /tmp/ 5020 127.0.0.1

这将启动服务器并共享/ tmp目录。如果在/ tmp /目录中找到index.html文件,则请求的浏览器将显示index.html内容,或者它将类似于FTP(尽管不是)。

以上是关于具有Crystal的WEBrick之类的服务器的主要内容,如果未能解决你的问题,请参考以下文章

从 webrick 发送推送事件

Phusion 乘客诉 WEBrick

简单webrick服务器

具有多个表的 Crystal 报表 - 空乘积或笛卡尔积

ruby 简单的Web服务器,Webrick

配置 Crystal Reports 所需的帮助