具有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)
当我运行编译并运行程序时,它将初始化服务器,但是有两个问题:
- 在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代码完全有效。
- 无法从本地网络上的任何其他设备访问我的服务器。
答案
您可能要为此使用HTTP::StaticFileHandler
。它提供本地目录中的文件。
- 在处理程序中,无论请求是什么,您总是读取文件
HTTP::StaticFileHandler
。这是行不通的。 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之类的服务器的主要内容,如果未能解决你的问题,请参考以下文章