Я пытаюсь написать промежуточное программное обеспечение, которое будет устанавливать дополнительные параметры для строки запроса. Вариант использования состоит в том, чтобы иметь возможность добавлять дополнительные токены аутентификации, например, к запросу, как того требует серверная часть, но желая внедрить его независимо от создания самого запроса.
Вот как выглядит мое промежуточное ПО (псевдокод):
class MyMiddleware < Struct.new(:app, :key, :value)
def call(env)
env.params[key] = value #1
#env.params = {key => value} #2
app.call env
end
end
- выше вызывает NoMethodError (неопределенный метод[]=' для nil:NilClass)`
- выше устанавливает хэш параметров, но параметр не кодируется как часть строки запроса. Строка запроса остается такой же, какой она была до того, как ПО промежуточного слоя начали обрабатывать запрос.
Мой анализ заключается в том, что, поскольку строка запроса создается из параметров вack_builder.rb:191
def build_response(connection, request)
app.call(build_env(connection, request))
end
def build_env(connection, request)
Env.new(request.method, request.body,
connection.build_exclusive_url(request.path, request.params), #<== rack_builder.rb:191
request.options, request.headers, connection.ssl,
connection.parallel_manager)
end
Промежуточное программное обеспечение не имеет возможности устанавливать дополнительные параметры. Хотя у env есть свойство params, оно равно нулю и, по-видимому, не затрагивается во время или после вызова промежуточного программного обеспечения.
Итак, у меня есть следующие вопросы: 1. Есть ли поддерживаемый способ добиться этого? 2. Если нет, есть ли способ перестроить строку запроса как часть выполнения промежуточного программного обеспечения? 3. Не лучше ли отложить построение URL-адреса до того, как будет выполнена большая часть цепочки промежуточного программного обеспечения запроса (но, конечно, до того, как адаптер сделает свое дело или сделает это в адаптере)? 4. Есть еще варианты?
Цените любое руководство.