後者がこの問題を修正したため、async_sinatra 0.5.0 から 1.0 にアップグレードしました。
ここまでは順調ですね。しかし、認証を含む元のアプリ (テスト アプリではなく) に戻ると、機能しなくなりました。私は vb.net を使用して webrequest を作成しています。
"The remote server returned an error: (401) Unauthorized."
ここに私のルビーコードがあります:
#gem 'async_sinatra', '0.5.0'
require 'sinatra/async'
class AsyncQueryServer < Sinatra::Base
register Sinatra::Async
set :server, 'thin'
set :port, 19876
enable :show_exceptions
helpers do
def protected!
unless authorized?
response['WWW-Authenticate'] = %(Basic realm="Restricted Area")
throw(:halt, [401, "Not authorized\n"])
end
end
def authorized?
@auth ||= Rack::Auth::Basic::Request.new(request.env)
begin
puts "@auth.provided? #{@auth.provided?}"
puts "@auth.basic? #{@auth.basic?}"
puts "@auth.credentials #{@auth.credentials}"
rescue Exception => e
puts e.message
end
@auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == ['myusername', 'mypassword']
end
end
apost '/execfqy' do
protected!
body request.body.string
end
not_found do
puts "in not found, request.fullpath #{request.fullpath}"
puts "in not found, request.request_method #{request.request_method}"
puts "in not found, request.params #{request.params}"
puts "in not found, request.class #{request.class}"
redirect '/'
end
end
AsyncQueryServer.run!
async_sinatra 1.0 へのアップグレードだと確信しています。
#gem 'async_sinatra', '0.5.0'
期待どおりに動作します。
興味深いことに、puts ステートメントの出力は、authorized? は両方のバージョンで同じであり、以下を示しています。
@auth.provided? false
undefined method `split' for nil:NilClass
@auth.provided? true
@auth.basic? true
@auth.credentials ["myusername", "mypassword"]
そして、これはこのページに基づいたvb.netのスニペットで、webrequestを作成します:
Private Function GetOutput(jsonDataBytes As Byte()) As String
Dim req As WebRequest
Dim res As String
' Dim cred As New Net.NetworkCredential("myusername", "mypassword")
Dim cred As New Net.NetworkCredential("myusername", "mypassword")
Dim req_str As String
req_str = _urlString & ":" & _portString & "/execfqy"
req = WebRequest.Create(req_str)
req.ContentType = "application/json"
req.Method = "POST"
req.ContentLength = jsonDataBytes.Length
req.Credentials = cred
Dim stream = req.GetRequestStream()
stream.Write(jsonDataBytes, 0, jsonDataBytes.Length)
stream.Close()
Try
Dim response = req.GetResponse().GetResponseStream()
Dim reader As New StreamReader(response)
res = reader.ReadToEnd()
reader.Close()
response.Close()
Catch e As WebException
Throw New NoResultsError("Request return nil results with error: " & e.Message)
res = Nothing
End Try
Return res
End Function
ヘルプ/提案/リダイレクトをいただければ幸いです。
ティア