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 相关文章推荐
Django admin美化插件suit使用示例
Dec 12 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
用Python实现大文本文件切割的方法
Jan 12 Python
python防止随意修改类属性的实现方法
Aug 21 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
Python中关于logging模块的学习笔记
Jun 03 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 Python
Python爬虫开发与项目实战
Dec 16 Python
Python实现小黑屋游戏的完整实例
Jan 06 Python
如何利用Matlab制作一款真正的拼图小游戏
May 11 Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 Python
Python 恐龙跑跑小游戏实现流程
Feb 15 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
重置版宣传动画
2020/04/09 魔兽争霸
php adodb连接带密码access数据库实例,测试成功
2008/05/14 PHP
解析thinkphp基本配置 convention.php
2013/06/18 PHP
php 判断是否是中文/英文/数字示例代码
2013/09/30 PHP
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
学习ExtJS Column布局
2009/10/08 Javascript
js文件中调用js的实现方法小结
2009/10/23 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
Angular2里获取(input file)上传文件的内容的方法
2017/09/05 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
详细介绍Ruby中的正则表达式
2015/04/10 Python
Flask框架的学习指南之用户登录管理
2016/11/20 Python
python使用正则表达式匹配字符串开头并打印示例
2017/01/11 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
python同步两个文件夹下的内容
2019/08/29 Python
Python numpy数组转置与轴变换
2019/11/15 Python
Python3 解决读取中文文件txt编码的问题
2019/12/20 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
中药专业大学生医药工作求职信
2013/10/25 职场文书
中学生期中自我鉴定
2014/04/20 职场文书
网络技术专业求职信
2014/07/13 职场文书
拾金不昧表扬稿
2015/01/16 职场文书
信访工作个人总结
2015/03/03 职场文书
2015年财务科工作总结范文
2015/05/13 职场文书
党纪处分决定书
2015/06/24 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书
《祁黄羊》教学反思
2016/02/20 职场文书