very functional prototype
This commit is contained in:
parent
8593315b95
commit
6dcf46f40a
64
hyde.rb
64
hyde.rb
|
@ -2,22 +2,30 @@ require 'mime-types'
|
|||
require 'webrick'
|
||||
|
||||
module Hyde
|
||||
# 404 text
|
||||
def default404(filepath)
|
||||
return "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\">
|
||||
<HTML>
|
||||
<HEAD><TITLE>File not found</TITLE></HEAD>
|
||||
<BODY>
|
||||
<H1>File not found</H1>
|
||||
#{filepath}
|
||||
<HR>
|
||||
<ADDRESS>
|
||||
Hyde on WEBrick/#{WEBrick::VERSION} (Ruby/#{RUBY_VERSION}/#{RUBY_RELEASE_DATE})
|
||||
</ADDRESS>
|
||||
</BODY>
|
||||
</HTML>"
|
||||
class Server < WEBrick::HTTPServer
|
||||
def initialize(config={},&setup)
|
||||
super(config)
|
||||
@hyde_pathspec = Hyde::Pathspec.new "/", &setup
|
||||
self.mount_proc '/' do |req,res|
|
||||
@hyde_pathspec.match(Hyde::Context.new(req.path, req, res))
|
||||
end
|
||||
end
|
||||
end
|
||||
module ErrorPages
|
||||
# 404 text
|
||||
def error404(request, filepath)
|
||||
request.response.status = 404
|
||||
if request.handles.include? 404
|
||||
request.response.body = request.handles[404].call(
|
||||
filepath
|
||||
)
|
||||
else
|
||||
request.response.body = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\">\n<HTML>\n <HEAD><TITLE>File not found</TITLE></HEAD>\n <BODY>\n <H1>File not found</H1>\n #{filepath}\n <HR>\n <ADDRESS>\n Hyde on WEBrick/#{WEBrick::VERSION} (Ruby/#{RUBY_VERSION}/#{RUBY_RELEASE_DATE})\n </ADDRESS>\n </BODY>\n</HTML>"
|
||||
end
|
||||
request.response["Content-Type"] = 'text/html'
|
||||
end
|
||||
module_function :error404
|
||||
end
|
||||
module_function :default404
|
||||
# Interchangeable pattern matching
|
||||
module PatternMatching
|
||||
def prep_path(path,safe_regex: true)
|
||||
|
@ -28,12 +36,15 @@ module Hyde
|
|||
end
|
||||
def match?(path)
|
||||
raise Exception, "Not permitted" if @lock_methods
|
||||
# behvaiour used by "index" method
|
||||
return true if @path == ""
|
||||
split_path = path.split("/").filter { |x| x != "" }
|
||||
if @path.kind_of? Regexp then
|
||||
# "safe" as in "will not result in path matching anomalies"
|
||||
return @path.match normalize_input(path) unless @safe_regex
|
||||
return Regexp.new("^"+@path.to_s+"$").match split_path[0]
|
||||
else
|
||||
# algorithm to match path segments until no more left in @path
|
||||
@path.split("/").filter { |x| x != "" }
|
||||
.each_with_index { |x,i|
|
||||
return false if x != split_path[i]
|
||||
|
@ -43,11 +54,12 @@ module Hyde
|
|||
end
|
||||
def normalize_input(path)
|
||||
raise Exception, "Not permitted" if @lock_methods
|
||||
# remove duplicate slashes and trim edge slashes
|
||||
(path.split "/").filter { |x| x != "" }.join("/")
|
||||
end
|
||||
def normalize(path)
|
||||
raise Exception, "Not permitted" if @lock_methods
|
||||
# remove multiple slashes in one spot and trim edge slashes
|
||||
# remove duplicate slashes and trim edge slashes
|
||||
path = normalize_input(path)
|
||||
# globbing behaviour simulated with regexp
|
||||
if path.match /(?<!\\)[\*\?\[]/ then
|
||||
|
@ -133,12 +145,7 @@ module Hyde
|
|||
request.response.body = data
|
||||
request.response["Content-Type"] = mimetype
|
||||
rescue Errno::ENOENT
|
||||
if request.handles.include? 404 then
|
||||
request.response.body = request.handles[404].call filepath
|
||||
request.response["Content-Type"] = "text/html"
|
||||
else
|
||||
request.response.body = Hyde::default404 filepath
|
||||
end
|
||||
Hyde::ErrorPages::error404 filepath
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -213,6 +220,7 @@ module Hyde
|
|||
match_path = normalize_input(request.path).match(@path)
|
||||
next_path = match_path[0]
|
||||
request.path = cut_path = match_path.post_match
|
||||
# remap/root method handling
|
||||
if @root_override then
|
||||
request.filepath = if @remap then
|
||||
@root_override+"/"
|
||||
|
@ -220,18 +228,14 @@ module Hyde
|
|||
else
|
||||
request.filepath = request.filepath+next_path+"/"
|
||||
end
|
||||
# error handle overlaying
|
||||
@handles.each_pair { |k,v| request.handles[k] = v }
|
||||
# passthrough to the next path object
|
||||
next_pathspec = @chain.find { |x| x.match? cut_path }
|
||||
next_pathspec.match request if next_pathspec
|
||||
# throw 404 if nowhere to go
|
||||
unless next_pathspec then
|
||||
if request.handles.include? 404
|
||||
request.response.body = request.handles[404].call(
|
||||
request.filepath+"/"+cut_path
|
||||
)
|
||||
else
|
||||
request.response.body = Hyde::default404(request.filepath+cut_path)
|
||||
end
|
||||
request.response["Content-Type"] = 'text/html'
|
||||
Hyde::ErrorPages::error404 request, request.request.path
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title> Welcome to Hyde </title>
|
||||
</head>
|
||||
<body>
|
||||
<h1> Welcome to <a href="https://adastra7.net/git/Yessiest/hyde">Hyde</a> </h1>
|
||||
<p> Hyde is the horrible side of Jekyll, and, consequently, this particular project.</p>
|
||||
<hr />
|
||||
<p> Created by Yessiest </p>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,26 +1,18 @@
|
|||
require 'webrick'
|
||||
require_relative 'hyde'
|
||||
|
||||
server = WEBrick::HTTPServer.new :Port => 8000
|
||||
trap 'INT' do server.shutdown end
|
||||
server.mount_proc '/' do |req,res|
|
||||
Hyde::Pathspec.new '/' do
|
||||
serve "index.html" do |ctx|
|
||||
ctx.response.body = "This is a test of webrick+hyde combination
|
||||
If you're seeing this, this means it's a success"
|
||||
ctx.response["Content-Type"] = "text/plain"
|
||||
server = Hyde::Server.new Port: 8000 do
|
||||
root "/home/yessiest/hyde/test/"
|
||||
serve "index.html"
|
||||
path "about" do
|
||||
serve "webrick" do |ctx|
|
||||
ctx.response.body = "WEBrick is a modular http server stack"
|
||||
ctx.response['Content-Type'] = "text/plain"
|
||||
end
|
||||
path "about" do
|
||||
serve "webrick" do |ctx|
|
||||
ctx.response.body = "WEBrick is weird and pretty undocumented"
|
||||
ctx.response["Content-Type"] = "text/plain"
|
||||
end
|
||||
serve "hyde" do |ctx|
|
||||
ctx.response.body = "Hyde was born because i thought Sinatra is cool, but nested paths are even cooler"
|
||||
ctx.response["Content-Type"] = "text/plain"
|
||||
end
|
||||
serve "hyde" do |ctx|
|
||||
ctx.response.body = "Hyde is the disgusting side of Jekyll, and, by extension, the thing that makes WEBrick usable."
|
||||
ctx.response['Content-Type'] = "text/plain"
|
||||
end
|
||||
end.match(Hyde::Context.new(req.path, req, res))
|
||||
end
|
||||
end
|
||||
server.start
|
||||
|
||||
server.start
|
||||
|
|
Loading…
Reference in New Issue