Sha256: 18de94711be0ee1150c7c276d856cb95d67f1acd6c25105520cf5a13f5533f69

Contents?: true

Size: 1.21 KB

Versions: 3

Compression:

Stored size: 1.21 KB

Contents

module Rack

  # A Rack middleware for providing JSON-P support.
  #
  # Full credit to Flinn Mueller (http://actsasflinn.com/) for this contribution.
  #
  class JSONP

    def initialize(app)
      @app = app
    end

    # Proxies the request to the application, stripping out the JSON-P callback
    # method and padding the response with the appropriate callback format.
    #
    # Changes nothing if no <tt>callback</tt> param is specified.
    #
    def call(env)
      status, headers, response = @app.call(env)
      request = Rack::Request.new(env)
      if request.params.include?('callback')
        response = pad(request.params.delete('callback'), response)
        headers['Content-Length'] = response.length.to_s
      end
      [status, headers, [response]]
    end

    # Pads the response with the appropriate callback format according to the
    # JSON-P spec/requirements.
    #
    # The Rack response spec indicates that it should be enumerable. The method
    # of combining all of the data into a single string makes sense since JSON
    # is returned as a full string.
    #
    def pad(callback, response, body = "")
      response.each{ |s| body << s.to_s }
      "#{callback}(#{body})"
    end

  end
end

Version data entries

3 entries across 3 versions & 3 rubygems

Version Path
rack-rack-contrib-0.9.2 lib/rack/contrib/jsonp.rb
tricycle-rack-contrib-0.9.3 lib/rack/contrib/jsonp.rb
rack-contrib-0.9.2 lib/rack/contrib/jsonp.rb