ruby实现的一个异步文件下载HttpServer实例
1.使用rubyeventmachine和em-http-servergem,完成一个简单的提供文件下载功能的HttpServer
2.使用了EM的FileStreamer来异步发送文件,发送文件时先组装了header,然后调用FileStreamer
require'rubygems'
require'eventmachine'
require'em-http-server'
classHTTPHandler<EM::HttpServer::Server
attr_accessor:filename,:filesize,:path
defprocess_http_request
#sendfileasync
if@http_request_method.to_s=~/GET/&&@http_request_uri.to_s.end_with?(filename)
send_data"HTTP/1.1200OK\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{
#filewassentsuccessfully
close_connection_after_writing
}
else
response=EM::DelegatedHttpResponse.new(self)
response.status=200
response.content_type'text/html'
response.content="PackageHttpServer<br>usage:wgethttp://host:port/#{filename}"
response.send_response
end
end
end
EM::rundo
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