0

In my Rails 7 app I want to implement Idempotency for incoming requests. I reckon this is a good example to use Rack middleware for such an action. So the implementation is simple:

  class IdempotencyMiddleware
    def initialize(app)
      @app = app
    end

    def call(env)
      if (key = env['HTTP_CE_IDEMPOTENCYKEY']).present?
        return [200, { 'Content-Type' => 'application/json' }, ['']] if IdempotencyKey.exists?(key:)

        IdempotencyKey.create!(key:)
      end
      @app.call(env)
    end
  end

# config/initializers/idempotency_middleware.rb
Rails.application.config.middleware.use IdempotencyMiddleware

I want to check if the incoming request have ce-idempotencykey. So the question is - should I check the HTTP_CE_IDEMPOTENCYKEY or maybe just ce-idempotencykey ? I can't find anything relevant that explain me which way to go.

mr_muscle
  • 2,536
  • 18
  • 61

1 Answers1

2

On the level of a Rack middleware, environment variables are still untranslated. Please see the Rack specification especially the section about HTTP_ Variables.

That means it is absolute correct to use uppercase character, underscore separated key names for environment variables in Rack middlewares.

spickermann
  • 100,941
  • 9
  • 101
  • 131