2017-11-14 17 views
1

게시 요청의 매개 변수를 해독/암호화하기 위해 레일즈 앱용 사용자 지정 미들웨어를 작성하고 있습니다. 난 내가 매개 변수를 액세스하고 필요에 따라 조작 할 수 있어요이랙 사용자 지정 미들웨어 오류 "ActionDispatch :: Http :: Parameters :: ParseError"

rack_input = env['rack.input'].read 

처럼 ENV의 OBJ를 읽고있다 요청 PARAMS을 읽으려면 'config/environments/staging.rb'

config.middleware.use CustomMiddleware 

의 미들웨어를 구성했습니다. 그러나 내가 수신기 인 앱 객체에 env obj를 넘겨 줄 때. 나는

Error occurred while parsing request parameters. 
Contents: 


F, [2017-11-15T02:13:50.230088 #24060] FATAL -- : [9aa25c7e-56e7-4894-ba30-3a01f60ae4fc] 
F, [2017-11-15T02:13:50.230340 #24060] FATAL -- : [9aa25c7e-56e7-4894-ba30-3a01f60ae4fc] ActionDispatch::Http::Parameters::ParseError (no implicit conversion of nil into String): 
F, [2017-11-15T02:13:50.230563 #24060] FATAL -- : [9aa25c7e-56e7-4894-ba30-3a01f60ae4fc] 
F, [2017-11-15T02:13:50.230782 #24060] FATAL -- : [9aa25c7e-56e7-4894-ba30-3a01f60ae4fc] app/middleware/custom_middleware.rb:34:in `call' 

내가 ENV 객체와 하드 코드 매개 변수를 읽을 수없는 경우 내 코드는 다음과

class CustomMiddleware 
    include Encryption 

    def initialize(app) 
    @app = app 
    end 

    def set_payload_params(env) 
    rack_input = env['rack.input'].read 
    @args = JSON.parse(rack_input) rescue {} 
    end 

    def call(env) 
    request = Rack::Request.new(env) 
    set_payload_params(env) 

    payload = @args['payload'] 

    decrypt_params 
    status, headers, response = @app.call(env) 
    encrypt_params 

    end 

처럼 다소, 아니이 전체 오류

"ActionDispatch::Http::Parameters::ParseError" 

을 받고 없습니다입니다 그러한 파싱 오류. 그리고 내 컨트롤러가 하드 코드 매개 변수에 데이터로 응답하고 있습니다.

내 레일 버전이 5.1.4 내가 잘 작동하는 다른 레일 응용 프로그램 (4.2.8)에서 비슷한 미들웨어했을 2.4.2

내 루비 버전입니다.

이것에 대한 통찰력은 많은 도움이 될 것입니다. 미리 감사드립니다.

답변

0

사용자 정의 미들웨어에서 content-type을 설정하는 해킹이 추가되어 스택의 다음 구성 요소로 입력을 전달하기 전에 입력 구문 분석을 피할 수있었습니다.

class CustomMiddleware 

    include Encryption 

    def initialize(app) 
    @app = app end 

    def set_payload_params(env) 
    rack_input = env['rack.input'].read 
    @args = JSON.parse(rack_input) rescue {} end 

    def call(env) 
    env['CONTENT_TYPE'] = '' 
    request = Rack::Request.new(env) 
    set_payload_params(env) 

    payload = @args['payload'] 

    decrypt_params 
    status, headers, response = @app.call(env) 
    encrypt_params 

    end