【问题标题】:Too many open files - socket(2) with net/http打开的文件太多 - 带有 net/http 的 socket(2)
【发布时间】:2012-05-01 07:30:27
【问题描述】:

我对 net/http 的 http 请求有问题...

我编写了一个与 dailymotion api 交互的 ruby​​ 脚本。 该脚本将上传视频“test.flv”。 基本上它由四个请求组成。

在“#Create the video object”步骤之前,它可以完美运行。 最后出现以下错误 "response = http.request(req)" 命令->

Errno::EMFILE: 打开的文件太多 - 套接字(2)

这里是代码,谢谢任何建议...

require 'net/http'
require 'curb'
require 'json'


# Authenticate the user
url = URI.parse( 'https://api.dailymotion.com/oauth/token' )
req = Net::HTTP::Post.new(url.path)
req.set_form_data({ 'grant_type' => 'password',
           'client_id' => 'my_client_id',
           'client_secret' => 'my_client_secret',
           'username' => 'myusername',
           'password' => 'mypassword'
         })
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
response = http.request(req)

access_token = JSON.parse( response.body )['access_token']
access_url = 'https://api.dailymotion.com/file/upload?access_token=' + access_token



# Get an upload URL
url = URI.parse( access_url )
req = Net::HTTP::Get.new( url.request_uri )
http = Net::HTTP.new( url.host, url.port )
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
response = http.request( req )

upload_url = JSON.parse( response.body )['upload_url']
progress_url = JSON.parse( response.body )['progress_url']


# Post the video
fields_hash = {}

post_data = fields_hash.map { |k, v| Curl::PostField.content(k, v.to_s) }
post_data << Curl::PostField.file('file', 'C:/test.flv')

c = Curl::Easy.new(upload_url)
c.multipart_form_post = true
c.http_post(post_data)

file_url = JSON.parse( c.body_str )['url']


# Create the video object
url = URI.parse( 'https://api.dailymotion.com/me/videos' )
req = Net::HTTP::Post.new(url.path)
req.set_form_data({ 'url' => file_url,
                'access_token' => access_token
         })
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
response = http.request(req)

puts response.body

【问题讨论】:

    标签: ruby-on-rails ruby sockets


    【解决方案1】:

    尝试调用finish

    http.finish
    

    在响应之后 = http.request(req)。

    【讨论】:

    • 在引发错误的最后一个响应 = http.request( req ) 之后尝试过,但仍然引发错误(可能无法调用完成,因为之前引发了错误)也尝试过它在我脚本前面的 response = http.request( req ) 之后打开,但这总是给我这个错误... IOError: HTTP session not yet started
    • 可能是在读取正文的时候开始会话。在 JSON.parse(response.body) 行之后尝试完成调用,对于 access_token = ... 和 progress_url = ...
    • 感谢回答...在阅读正文后拨打完成电话,但我仍然收到 IOError
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多