100行代码构建自己的html服务器


#1

构建自己的html服务器我觉得是有意义的

比如说当你想向别人展示某个org文件 或是查看已经写好的md文件 (让别人能用他自己的手机或电脑看到)

我觉的更关键的是 他有丰富的视觉展示及用户交互()

终于可以用我喜欢的颜色看文档了

我的第一个证明

Theorem andb_true_elim2 : forall b c : bool,
    andb b c = true -> c = true.

Proof.
  intros b c H.
  apply andb_prop with (a:=b )(b:=c) .
  assumption.
Qed.

#2

怎么用?有demo或者docs吗?


#3

怎么用?

就是创建了个本地的http服务器

docs没有 都在注释里(我觉得回点ocaml的人都能看懂)

我是用ocaml 你也可以用nodejs java php ruby scala 或是 C++

建个http服务器很简单 下面的代码用的是nodejs

关键的就是你问的 怎么用? 答案应该是 你想怎么用?

github基于git创建了github facebook一开始是php写的

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

#4

python -m http.server


#5

请问 他能查看md文件吗?


#6

不能,紫薯布丁


#7

直接用apache吧,我甚至就写在了我的emacs配置里面(windows),启动emacs时,直接就打开一个buffer 执行shell在调用apache,其它nodejs python java怎么弄,也没有apache功能强,buffer里是异步的,也不会影响emacs的启动速度


#9

php -S 0.0.0.0:80


#10

加了几行代码 可以支持预览md了

open Lwt
open Cohttp
open Cohttp_lwt_unix
open Omd

let root = "~/server"

let read_file file_name =
  let input = open_in file_name in
  let content = ref "" in
  try
    while true do
    let line =input_line input ^ "\n"  in
      content := (!content) ^ line;
    done;
    !content
  with End_of_file ->
    close_in input ;
    !content

let is_end_with path suf =
  let len_p = String.length path in
  let len_s = String.length suf in
  if len_p < len_s
  then false
  else
    (String.sub path (len_p - len_s) len_s) = suf

let is_md_file path = is_end_with path ".md"

let is_html_file path = is_end_with path ".html"

let html_to_md_name root_path =
  let len = String.length root_path in
  if is_html_file root_path
  then (String.sub root_path 0 (len - 5) ) ^ ".md"
  else
    root_path

let md_to_html md_file_name =
  let md_content = read_file md_file_name in
  let my_temp_head = read_file (root ^ "/md_head.html") in
  let my_temp_tail = read_file (root ^ "/md_tail.html") in
  let omd_md = Omd.of_string md_content in
  let omd_html = Omd.to_html omd_md in
  my_temp_head ^ omd_html ^ my_temp_tail

let file_cache = Hashtbl.create 100

let file_mtime file_name =
  let file_desc = Unix.openfile file_name [O_RDONLY] 7 in
  let file_state = Unix.fstat file_desc in
  Unix.close file_desc ;
  string_of_float file_state.st_mtime

let check_file path =
  let root_path = root ^ "/root" ^ path in
  try
    let file_desc = Unix.openfile root_path [O_RDONLY] 4 in
    Unix.close  file_desc ;
    root_path
  with Unix.Unix_error (_, _ ,_) ->
    html_to_md_name root_path ;;

let chong_res path =
  let root_path = check_file path in
  let cache_key = root_path ^ file_mtime root_path in
  try
    Printf.printf "%s" root_path;
    Hashtbl.find file_cache cache_key
  with Not_found ->
    if is_md_file root_path  then
      let html_of_md = md_to_html root_path in
      Hashtbl.add  file_cache cache_key html_of_md;
      html_of_md
    else
      let file_content = read_file root_path in
      Hashtbl.add  file_cache cache_key file_content;
      file_content

let server =
  let callback _conn req body =
    let uri = req |> Request.uri |> Uri.to_string in
    let path = req |> Request.uri |> Uri.path in
    let meth = req |> Request.meth |> Code.string_of_method in
    let headers = req |> Request.headers |> Header.to_string in
    body |> Cohttp_lwt.Body.to_string >|=
      (fun body ->
        (Printf.sprintf "Uri: %s\nMethod: %s\nHeaders\nHeaders: %s\nBody: %s"
         uri meth headers body))
    >>= (fun body -> Server.respond_string ~status:`OK
                       ~body:(chong_res path) ())
  in
  Server.create
    ~mode:(`TCP (`Port 8000))
    (Server.make ~callback ())

let () = ignore (Lwt_main.run server)

#11

一行构建http服务器怎么样。

python -m SimpleHTTPServer 9999

#12

要能看md文件的


#13

用grip可以

pip install grip
grip . 8888

#14

对 grip 我还有问题


#15

能看 md 了 还能看pdf


#16

https://video.h5.weibo.cn/1034:4414238224010555/4414241614174072


#17

除了浪费时间还有啥, 你吧文件或者HTML 上传到 OSS 或者cdn, 给对方一个链接,既便宜 又方便快速, 性能还好。 现在都2091年了


#18

@zhouchongzxc 指的应该是在一个大型的局域网内分享文件吧?(公司内?)这样的话感觉没有必要上传OSS或者cdn, 内网搞定就没必要外网了,毕竟外网在怎么弄,速度也没有内网快。我建的apache服务器,内网电脑从另一台电脑下载几个G的文件也几分钟就搞定了


#19

你都用emacs了 还想着不浪费时间?


#21

看了一圈回复没说nginx的


#22

结合着 webslides ,可以用幻灯片的方式看文档了!

再实现一个类似于anki的功能就够用了