def call is creating an instance variable of @request. This is not thread safe and causes undefined method 'helpers' for nil (NoMethodError) because another request has come in and replaced @request with a non interceptable_request?.
There are 2 approaches to fix this.
Option 1
dup the middleware in call. This seems wasteful.
def call(env)
dup._call(env)
end
def _call(env)
status, headers, response = @app.call(env)
@request = ActionDispatch::Request.new(env)
if interceptable_request? && html_response?(headers)
html = html_from(response)
html = inject_options(html)
html = inject_javascript(html)
headers["Content-Length"] = html.bytesize.to_s if html
response = [ html ]
end
[ status, headers, response ]
end
Option 2
Do not use instance variables in call and pass local variables where necessary.
def call(env)
status, headers, response = @app.call(env)
request = ActionDispatch::Request.new(env)
if interceptable_request?(request) && html_response?(headers)
view_helpers = request.controller_instance.helpers
html = html_from(response)
html = inject_options(html, view_helpers)
html = inject_javascript(html, view_helpers)
headers["Content-Length"] = html.bytesize.to_s if html
response = [ html ]
end
[ status, headers, response ]
end
Let me know which option is preferable and I can work on the pull request.
def callis creating an instance variable of@request. This is not thread safe and causesundefined method 'helpers' for nil (NoMethodError)because another request has come in and replaced@requestwith a noninterceptable_request?.There are 2 approaches to fix this.
Option 1
dupthe middleware in call. This seems wasteful.Option 2
Do not use instance variables in call and pass local variables where necessary.
Let me know which option is preferable and I can work on the pull request.