Ruby使用eventmachine为HTTP服务器添加文件下载功能


Posted in Python onApril 20, 2016

思路:
使用ruby eventmachine和em-http-server gem,完成一个简单的提供文件下载功能的HttpServer;
使用了EM的FileStreamer来异步发送文件,发送文件时先组装了header,然后调用FileStreamer。

代码:

require 'rubygems'
require 'eventmachine'
require 'em-http-server'
 
class HTTPHandler < EM::HttpServer::Server
 attr_accessor :filename, :filesize, :path
 
 def process_http_request
  #send file async
  if @http_request_method.to_s =~ /GET/ && @http_request_uri.to_s.end_with?(filename)
   send_data "HTTP/1.1 200 OK\n"
   send_data "Server: XiaoMi\n"
   send_data "Connection: Keep-Alive\n"
   send_data "Keep-Alive: timeout=15\n"
   send_data "Content-Type: application/octet-stream\n"
   send_data "Content-Disposition: filename='#{filename}'\n"
   send_data "Content-Length: #{filesize}\n"
   send_data "\n"
 
   streamer = EventMachine::FileStreamer.new(self, path)
   streamer.callback {
    # file was sent successfully
    close_connection_after_writing
   }
  else
   response = EM::DelegatedHttpResponse.new(self)
   response.status = 200
   response.content_type 'text/html'
   response.content = "Package HttpServer<br>usage: wget http://host:port/#{filename}"
   response.send_response
  end
 end
 
end
 
EM::run do
 path = '/tmp/aaa.tar.gz'
 EM::start_server("0.0.0.0", 8080, HTTPHandler) do |conn|
  conn.filename = File.basename(path)
  conn.filesize = File.size(path)
  conn.path = path
 end
end

PS:关于eventmachine安装错误的问题
在windows上安装 eventmachine 总是报错:
 

Building native extensions. This could take a while...
ERROR: Error installing eventmachine:
    ERROR: Failed to build gem native extension.

或者另外一种:

ERROR: Error installing ruby-debug:
      The 'linecache' native gem requires installed build tools.
   
  Please update your PATH to include build tools or download the DevKit
  from 'http://rubyinstaller.org/downloads' and follow the instructions
  at 'http://github.com/oneclick/rubyinstaller/wiki/Development-Kit'

后来经过了漫长的Google,找到了2个solution:

1.用更低版本的eventmachine
 
这个提示一直不断,下面还有一大难错误,都是C的编译错误后来网上找了两个方法
(1)

gem install eventmachine-win32

这个貌似安装的是较低版本的
(2)gem install

eventmachine --pre

这个貌似安装的是 beta 1.0.0的。

 
2.升级devkit
 
看了一下,上面没有提具体的解决方案,但是给出了问题产生的两个可能原因:
(1)没有C编译环境
(2)路径当中有空格
看看上面的错误日志,发现可能就是编译环境的问题。于是找了一下。
我的ruby是用one-click installer装的,版本是1.8.6-p398。
在rubyinstaller的addon页面,找到了DevKit。
看了一下DevKit的说明:

//Sometimes you just want RubyGems to build that cool native,
//C-based extension without squawking.
//Who's your buddy? DevKit!
看来这就是我需要的。
 
出错的原因是安装eventmachine的时候,需要build tools,但系统中没有。出错信息中同时也给出了解决的法案:
(1) 到 http://rubyinstaller.org/downloads/ 去下载dev kit ? DevKit-tdm-32-4.5.1-20101214-1400-sfx.exe
(2)按照 http://github.com/oneclick/rubyinstaller/wiki/Development-Kit/ 安装dev kit
主要安装步骤如下:
如果原来系统中已经安装了旧版的dev kit, 则删除它
下载上面提到的dev kit
解压下载下来的文件到指定的目录,如c:/devkit。(注意:目录不能有空格)
运行ruby dk.rb,然后按照提示分别运行ruby dk.rb init 和 ruby dk.rb install来增强ruby
可以运行

gem install rdiscount ?platform=ruby

来测试是否成功。
按照安装步骤,完成了DevKit的安装,非常简单。

然后,再次安装eventmachine:

gem install eventmachine
Python 相关文章推荐
python实现读取命令行参数的方法
May 22 Python
python使用clear方法清除字典内全部数据实例
Jul 11 Python
Python操作MySQL数据库的方法
Jun 20 Python
python用插值法绘制平滑曲线
Feb 19 Python
浅析python内置模块collections
Nov 15 Python
PyTorch使用cpu加载模型运算方式
Jan 13 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 Python
Python try except异常捕获机制原理解析
Apr 18 Python
Python3创建Django项目的几种方法(3种)
Jun 03 Python
Python的控制结构之For、While、If循环问题
Jun 30 Python
Python selenium环境搭建实现过程解析
Sep 08 Python
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
May 04 Python
Python实现HTTP协议下的文件下载方法总结
Apr 20 #Python
详解Python命令行解析工具Argparse
Apr 20 #Python
利用Python如何生成随机密码
Apr 20 #Python
Python自动化部署工具Fabric的简单上手指南
Apr 19 #Python
python实现简单socket通信的方法
Apr 19 #Python
python实现域名系统(DNS)正向查询的方法
Apr 19 #Python
python安装与使用redis的方法
Apr 19 #Python
You might like
php 接口类与抽象类的实际作用
2009/11/26 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
js对象与打印对象分析比较
2013/04/23 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
完美实现仿QQ空间评论回复特效
2015/05/06 Javascript
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
JS+CSS3制作炫酷的弹窗效果
2016/11/08 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
如何在vue中使用jointjs过程解析
2020/05/29 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
Python谱减法语音降噪实例
2019/12/18 Python
Python decorator拦截器代码实例解析
2020/04/04 Python
利用scikitlearn画ROC曲线实例
2020/07/02 Python
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
Final类有什么特点
2012/04/25 面试题
超市重阳节活动方案
2014/02/10 职场文书
优质服务演讲稿
2014/05/14 职场文书
企业口号大全
2014/06/12 职场文书
社团活动总结报告
2014/06/27 职场文书
建筑结构施工求职信
2014/07/11 职场文书
甘南现象心得体会
2014/09/11 职场文书
优秀教师事迹材料
2014/12/15 职场文书
中秋节随笔
2015/08/15 职场文书
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS
Python如何让字典保持有序排列
2022/04/29 Python
SQL Server中使用表变量和临时表
2022/05/20 SQL Server