gpt4 book ai didi

ruby - Sinatra 助手伪造请求

转载 作者:数据小太阳 更新时间:2023-10-29 07:06:22 24 4
gpt4 key购买 nike

总结

Sinatra 内Web 应用程序,如何向应用程序发出虚拟请求并以文本形式返回响应正文?例如,这些路线...

get('/foo'){ "foo" }
get('/bar'){ "#{spoof_request '/foo'} - bar" }

...当使用 Web 浏览器请求“/bar”时,应产生响应“foo - bar”。

动机

我的应用程序有一个代表错误条目的页面,其中包含关于该错误条目的大量详细信息:错误出现在哪个版本中,它有多重要,与之关联的标签是什么,错误分配给了谁等等.

用户可以在此页面上以交互方式编辑单个数据。使用我的 AJAXFetch jQuery 插件,JavaScript 使用 AJAX 将页面的只读部分(例如,此错误分配给的人的姓名)替换为 HTML 部分表单,以便仅编辑该部分。用户提交表单,AJAX 对该字段的静态版本发出新请求。

为了得到DRY ,我希望创建页面的 Haml View 使用与 AJAX 在创建各个静态片段时完全相同的请求。例如:

#notifications.section
%h2 Email me if someone...
.section-body= spoof_request "/partial/notifications/#{@bug.id}"

不太好用的代码

定义 spoof_request 的以下助手在 Sinatra 1.1.2 下工作:

PATH_VARS = %w[ REQUEST_PATH PATH_INFO REQUEST_URI ]
def spoof_request( uri, headers=nil )
new_env = env.dup
PATH_VARS.each{ |k| new_env[k] = uri.to_s }
new_env.merge!(headers) if headers
call( new_env ).last.join
end

然而,在 Sinatra 1.2.3 下,这不再有效。尽管将每个 PATH_VARS 设置为所需的 URI,call(new_env) 仍会导致 Sinatra 处理当前请求的路由,而不是指定路径的路由。 (这导致无限递归,直到堆栈级别最终触底。)

这个问题不同于 Calling Sinatra from within Sinatra因为那个(旧)问题的已接受答案不会维持用户的 session 。

最佳答案

我使用的代码比 answer in the Sinatra README 更复杂,但依赖于相同的机制。由于该版本中的错误,我的代码和 README 中的答案都不能在 1.2.3 下工作。两者现在都在 1.2.6 下工作。

这是一个简单的助手的测试用例:

require 'sinatra'
helpers do
def local_get(url)
call(env.merge("PATH_INFO" => url)).last.join
end
end
get("/foo"){ "foo - #{local_get '/bar'}" }
get("/bar"){ "bar" }

在行动中:

phrogz$ curl http://localhost:4567/foo
foo - bar

关于ruby - Sinatra 助手伪造请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5824736/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com