class Rack::JSONP::Callback

Public Class Methods

new(app, callback_param = 'callback') click to toggle source
# File lib/rack/jsonp/callback.rb, line 4
def initialize(app, callback_param = 'callback')
  @app = app
  @callback_param = callback_param
end

Public Instance Methods

call(env) click to toggle source
# File lib/rack/jsonp/callback.rb, line 9
def call(env)
  request = Rack::Request.new(env)

  callback = request.params[@callback_param]

  if callback
    env['jsonp.utils.callback'] = callback

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

    if headers['Content-Type'].to_s.start_with?('application/json')
      response = pad(callback, response)

      headers['Content-Length'] = response.first.bytesize.to_s
      headers['Content-Type']   = 'application/javascript'

      [200, headers, response]
    else
      [status, headers, response]
    end
  else
    @app.call(env)
  end
end

Private Instance Methods

pad(callback, response) click to toggle source
# File lib/rack/jsonp/callback.rb, line 36
def pad(callback, response)
  body = ''

  response.each do |s|
    body << s.to_s.gsub("\u2028", '\u2028').gsub("\u2029", '\u2029')
  end

  response.close if response.respond_to?(:close)

  ["/**/#{callback}(#{body})"]
end