简单HTTP Server

2022-10-25  本文已影响0人  Bruce钟

简单HTTP Server

有时候我们希望启动一个http服务,做简单的测试,但是又不希望部署apache nginx等较复杂的环境,有以下方式可以使用。

一行命令启动

非常简单的一个命令启动http server:

以上命令都可以启动一个http server,或者浏览对应目录的文件(如果没有index.html)。

简单Ruby Server

自己写一个简单server的目的就是处理文件名的问题(好在我了解怎么用ruby写一个简单的server):如果手搓一个html文件,想要测试效果(又不想将文件名改为index.html),那么就得在浏览器里面输入html的文件名,才能访问到(或者点击链接)。完全可以写一个脚本,输入一个文件做参数,访问根路径的时候将这个文件当做index.html输出,访问其他路径就输出其他文件的内容。

代码清单见结尾。

简单File Server on http

有时候仅仅是测试页面或者浏览、下载文件还是不够,希望能够便捷的上传文件的话,怎么办呢?

其实可用的方案很多, 比如常用的samba server共享用户目录(但是需要打开对应的目录,路径较深一般都挺麻烦),scp、ftp、sftp需要打开对应的工具软件,选择对应的目录然后上传。scp的话需要敲路径(或是上传之后再move一下),如果路径有汉字、空格都很麻烦。而我需求就是想快速往某个目录上传几个文件而已。

于是快速开启一个http server,并上传到执行命令的目录或者指定目录就很方便。如果命令顺便打印出来访问的url和port(就像多数nodejs应用)就更方便了,在windows terminal中只需要点击一下就会启动浏览器打开上传页面了。

以上三个工具中,python 的 uploadserver算是最好用的了,基于这个模块做简单包装就基本可以满足我的需求(http-upload.sh):

#!/bin/sh
ip=`hostname -I | cut -d ' ' -f 1`
port=8080
echo "upload: http://$ip:$port/upload"
python3 -m uploadserver -b $ip $port

但是,测试过以上工具之后,还是不太满意,我想要一种简单的file server,基于http页面,可以浏览目录下面的文件,也能上传文件,界面稍微好看一点(python uploadserver已经非常接近了,就是界面太差)。于是决定自己做一个。

附件

脚本 serve-html.rb 代码清单。 使用为 serve-html.rb test.html,执行后根据输出的url直接访问测试效果。

#!/usr/bin/env ruby

# simple http server to test html file
# serve-html.rb test.html

require 'webrick'
require 'stringio'

root = File.expand_path '.'
port = 8180
server = WEBrick::HTTPServer.new :Port => port, :DocumentRoot => root

trap 'INT' do server.shutdown end

default_file = ARGV.size > 0 ? ARGV[0] : "index.html"

server.mount_proc '/' do |req, res|
  if req.path == '/'
    local_path = default_file
  else
    local_path = File.join(root, req.path)
  end
  fail "#{local_path} not exist!" if not File.exist? local_path
  res.body = IO.read(local_path)
end

ip = IO.popen("hostname -I").read.split.first
puts "start server at http://#{ip}:#{port}"
puts "start without default file." if ARGV.empty?
server.start
上一篇 下一篇

猜你喜欢

热点阅读