dart http server踩坑记

603 阅读2分钟

0x01 事发当晚

在一个(夜黑风高)平平无奇的夜晚,日常突发奇想的我,又有了新想法。现在大家日常写http server第一个想起的就是NodeJs / java / python,对吧?但是有没有发现!这些都需要服务器安装runtime运行。而runtime不仅占用空间,vm也需要使用一部分的内存,那为什么不用一个可以直接编译成二进制的可执行文件的语言编写呢?

然而,大家最先想起的,莫过于C / C艹了吧。但是这些吧,不是不行,就是太麻烦,就是开发效率太低。但是!但是!但是!dart!也可以!

所以,我就想,要不试试用dart写一个server试试吧。

0x02 转角遇见意外

第一件事莫过于技术调研了,我其实之前就看过dart的server端框架,但是进去再一看!GitHub的repo都已经archive了。

那行吧,那就是我最嗨森的造轮子环节了。嘿嘿嘿。

我熟练地创建了一个dart项目,实例化HttpServer, bind,127.0.0.1……
本以为会顺利的大功告成……

但是意外,就这样悄咪咪的,在转角出现了……
他妈的怎么能没有body parser!
没有就算了,为什么multipart也没有parser!

那好吧,手撸!

0x03 各种尝试之后的设计思路

其实多年之前我就大概知道了为什么读写文件的时候是以stream的方式读写的。
大概可以这么理解,因为读文件的时候由于各种各种不能一次读完,所以只能一次读一点,一次读一点。
那么一个一个chunk连续出现, 就像水流(water flow)一样,就选择了stream这个词……(个人理解个人理解)

想着想着……水流……水……水……水管!!
于是,出现了我的思路。

以水管的方式,查找boundary

大家可以想象一下,一根水管,水管的长度和boundary的长度一样一头是boundary的头,一头是boundary的尾,那我是不是就可以通过检查水管的头和尾来确定水管里面大概率是boundary还是别的东西了。

高效!机智如我!

于是吧…… 一个新的package诞生了……

github|multipart.dart
pub.dev|multipart

欢迎大家互相学习鸭(求star嘿嘿嘿)