a few examples for testing purposes; basic unicode validation for paths (less 500s on invalid unicode spam)
This commit is contained in:
parent
8284c58509
commit
d098f239a1
|
@ -0,0 +1,17 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'landline'
|
||||||
|
|
||||||
|
class App < Landline::App
|
||||||
|
path "/outer" do
|
||||||
|
path "/inner" do
|
||||||
|
get "/oucher" do
|
||||||
|
"Hello world"
|
||||||
|
end
|
||||||
|
remap __dir__
|
||||||
|
serve "*"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
run App.new
|
|
@ -1,10 +0,0 @@
|
||||||
#
|
|
||||||
# ~/.bashrc
|
|
||||||
#
|
|
||||||
|
|
||||||
# If not running interactively, don't do anything
|
|
||||||
[[ $- != *i* ]] && return
|
|
||||||
|
|
||||||
# alias ls='ls --color=auto'
|
|
||||||
# alias grep='grep --color=auto'
|
|
||||||
# PS1='[\u@\h \W]\$ '
|
|
|
@ -3,8 +3,10 @@
|
||||||
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/lib")
|
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/lib")
|
||||||
require 'landline'
|
require 'landline'
|
||||||
|
|
||||||
|
ROOT=__dir__
|
||||||
|
|
||||||
app = Landline::Server.new do
|
app = Landline::Server.new do
|
||||||
root ENV["PWD"]
|
root ROOT
|
||||||
index ["index.html"]
|
index ["index.html"]
|
||||||
post "/" do
|
post "/" do
|
||||||
formdata = form if form?
|
formdata = form if form?
|
||||||
|
@ -12,7 +14,7 @@ app = Landline::Server.new do
|
||||||
if formdata
|
if formdata
|
||||||
formdata["form_files"].each do |file|
|
formdata["form_files"].each do |file|
|
||||||
filename = file.filename.split("/").last
|
filename = file.filename.split("/").last
|
||||||
`mv #{file.tempfile.path} $PWD/files/#{filename}`
|
`mv #{file.tempfile.path} #{ROOT}/files/#{filename}`
|
||||||
files[file.filename] = "<a href=\"files/#{filename}\">#{filename}</a>"
|
files[file.filename] = "<a href=\"files/#{filename}\">#{filename}</a>"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!DOCTYPE>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Form upload test</title>
|
<title>Form upload test</title>
|
||||||
|
@ -7,6 +7,42 @@
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<script>
|
||||||
|
function postFile() {
|
||||||
|
let progress = document.getElementById('progress')
|
||||||
|
|
||||||
|
progress.style.display = 'block';
|
||||||
|
|
||||||
|
let formdata = new FormData();
|
||||||
|
|
||||||
|
let files = document.getElementById('form_files').files;
|
||||||
|
|
||||||
|
for (const file of files)
|
||||||
|
{
|
||||||
|
formdata.append('form_files[]', file);
|
||||||
|
}
|
||||||
|
|
||||||
|
let request = new XMLHttpRequest();
|
||||||
|
let filesize = 0;
|
||||||
|
for (const file of files) {
|
||||||
|
filesize = filesize + file.size;
|
||||||
|
}
|
||||||
|
console.log(filesize);
|
||||||
|
|
||||||
|
request.upload.addEventListener("progress", function(e) {
|
||||||
|
console.log(e.loaded);
|
||||||
|
if (e.loaded <= filesize) {
|
||||||
|
let percent = Math.round(e.loaded / filesize * 100);
|
||||||
|
progress.innerHTML = `${e.loaded} / ${filesize}`;
|
||||||
|
} else {
|
||||||
|
progress.innerHTML = 'Upload finished!';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
request.open('post', '/');
|
||||||
|
request.send(formdata);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
<h1>File uploader</h1>
|
<h1>File uploader</h1>
|
||||||
<hr/>
|
<hr/>
|
||||||
<p> Add files here: <p>
|
<p> Add files here: <p>
|
||||||
|
@ -15,8 +51,11 @@
|
||||||
enctype="multipart/form-data">
|
enctype="multipart/form-data">
|
||||||
<input id="form_files" type="file" name="form_files[]" multiple>
|
<input id="form_files" type="file" name="form_files[]" multiple>
|
||||||
<label for="form_files">Attach file</label>
|
<label for="form_files">Attach file</label>
|
||||||
<input type="submit" value="Send form">
|
<button type="button" onclick="postFile();">"Send form"</button>
|
||||||
</form>
|
</form>
|
||||||
|
<p id="progress" style="display: none;">
|
||||||
|
Loading
|
||||||
|
</p>
|
||||||
<% if (defined? formdata) and formdata %>
|
<% if (defined? formdata) and formdata %>
|
||||||
<hr>
|
<hr>
|
||||||
<ul>
|
<ul>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
Gem::Specification.new do |spec|
|
Gem::Specification.new do |spec|
|
||||||
spec.name = "landline"
|
spec.name = "landline"
|
||||||
spec.version = "0.13.0"
|
spec.version = "0.13.1"
|
||||||
spec.summary = "Elegant HTTP DSL"
|
spec.summary = "Elegant HTTP DSL"
|
||||||
spec.description = <<~DESC
|
spec.description = <<~DESC
|
||||||
Landline is a no-hard-dependencies HTTP routing DSL that was made entirely for fun.
|
Landline is a no-hard-dependencies HTTP routing DSL that was made entirely for fun.
|
||||||
|
@ -15,5 +15,5 @@ Gem::Specification.new do |spec|
|
||||||
spec.homepage = "https://adastra7.net/git/Yessiest/landline"
|
spec.homepage = "https://adastra7.net/git/Yessiest/landline"
|
||||||
spec.files = Dir["lib/**/*"]
|
spec.files = Dir["lib/**/*"]
|
||||||
spec.extra_rdoc_files = Dir["*.md"]
|
spec.extra_rdoc_files = Dir["*.md"]
|
||||||
spec.required_ruby_version = ">= 3.0.6"
|
spec.required_ruby_version = ">= 3.0.0"
|
||||||
end
|
end
|
||||||
|
|
|
@ -12,7 +12,7 @@ require_relative 'landline/app'
|
||||||
# Landline is a backend framework born as a by-product of experimentation
|
# Landline is a backend framework born as a by-product of experimentation
|
||||||
module Landline
|
module Landline
|
||||||
# Landline version
|
# Landline version
|
||||||
VERSION = '0.13.0 "Realign" (pre-alpha)'
|
VERSION = '0.13.1 "EDM Death Machine" (pre-alpha)'
|
||||||
|
|
||||||
# Landline branding and version
|
# Landline branding and version
|
||||||
VLINE = "Landline/#{Landline::VERSION} (Ruby/#{RUBY_VERSION}/#{RUBY_RELEASE_DATE})\n".freeze
|
VLINE = "Landline/#{Landline::VERSION} (Ruby/#{RUBY_VERSION}/#{RUBY_RELEASE_DATE})\n".freeze
|
||||||
|
|
|
@ -27,6 +27,9 @@ module Landline
|
||||||
def call(env)
|
def call(env)
|
||||||
request = Landline::Request.new(env)
|
request = Landline::Request.new(env)
|
||||||
|
|
||||||
|
failed_msg = check_unicode(request)
|
||||||
|
return failed_msg.finalize if failed_msg
|
||||||
|
|
||||||
response = handle_jumps(request)
|
response = handle_jumps(request)
|
||||||
request.run_postprocessors(response)
|
request.run_postprocessors(response)
|
||||||
resp = response.finalize
|
resp = response.finalize
|
||||||
|
@ -54,6 +57,22 @@ module Landline
|
||||||
response
|
response
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Check that all important parameters are actually valid unicode
|
||||||
|
def check_unicode(request)
|
||||||
|
return false if request.path.valid_encoding? &&
|
||||||
|
request.query.query.valid_encoding? &&
|
||||||
|
request.server_name.valid_encoding?
|
||||||
|
|
||||||
|
response = Landline::Response.convert(
|
||||||
|
@properties["handle.default"].call(
|
||||||
|
400,
|
||||||
|
backtrace: ["Invalid unicode string"]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
response.status = 400
|
||||||
|
response
|
||||||
|
end
|
||||||
|
|
||||||
# Inititalization block for property setup
|
# Inititalization block for property setup
|
||||||
def setup_properties(*_args, **_opts)
|
def setup_properties(*_args, **_opts)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue