Sinatra 助手伪造请求

2023-11-23

Summary

在一个SinatraWeb 应用程序,如何向应用程序发出虚拟请求并以文本形式获取响应正文?例如,这些路线...

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

...当使用网络浏览器请求“/bar”时,应该得到响应“foo - bar”。

动机

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

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

为了DRY,我希望创建页面的 Haml 视图使用与创建各个静态片段时 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 处理当前请求的路由,而不是指定的路径。 (这会导致无限递归,直到堆栈级别最终触底。)

这个问题不同于从 Sinatra 内部呼叫 Sinatra因为该(旧)问题的接受答案不会维持用户的会话。


我使用的代码比Sinatra 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sinatra 助手伪造请求 的相关文章

  • 下载所有 gems 依赖项

    我想通过下载任何所需的文件并将它们带到另一台计算机来安装指南针没有互联网连接 我已经下载了指南针的源包 当我在未连接的计算机上运行 gem 时 它抱怨缺少依赖项 有什么解决办法吗 这正是我遇到的问题 经过一段时间的搜索后 我找到了一个可以使
  • class_eval、class_exec、module_eval 和 module_exec 之间有什么区别?

    我正在读Module文档 但似乎无法理解它们的差异以及应该在哪里使用 怎么样eval不同于exec 我将回答比你的问题更多的内容 包括instance eval exec 在你的问题中 所有变体 instance module class
  • Rspec to have(n).items undefined 方法

    我正在尝试遵循指南关于代码 tuts http code tutsplus com tutorials ruby for newbies testing with rspec net 21297我不断收到错误 这是我的库规范 require
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • Ruby 的 Faraday - 多次包含相同的参数

    我正在使用一个 API 该 API 迫使我多次发送相同的参数名称以级联不同的过滤条件 因此 示例 api GET 调用如下所示 GET http api site com search a b1 a b2 a b3 a c2 我使用 Far
  • 随机采样数组的唯一子集

    如果我有一个数组 a 1 2 3 如何随机选择数组的子集 以使每个子集的元素都是唯一的 也就是说 对于a可能的子集是 1 2 3 1 2 2 3 1 2 3 我无法生成所有可能的子集 因为 a 的实际大小非常大 因此有很多很多子集 目前 我
  • Ruby on Rails 离线编程

    我将离开互联网几周 但仍然想完成一个项目 我应该采取哪些步骤来确保在断开连接时能够访问我需要的内容 ruby 和 ROR 离线时 以下内容很难获得 gems docs Rails 专家博客 堆栈溢出 so gem 安装尽可能多 下载所有的轨
  • Ruby on Rails Webpacker 找不到 asset_pack_path 下的图像

    我在使用 Ruby on Rails Webpacker 在视图中包含图像时遇到问题 当我尝试使用 html img 标签和 asset pack path 在我的视图中插入图像时 出现错误 我的图像位于app javascript ima
  • ruby 管道、IO 和 stderr 重定向

    我希望有一个 ruby 程序 一个 rake 任务 观察另一个 rake 任务的输出 输出写入器输出到 stderr 我想读一下这些行 我很难设置它 如果我有一个作家 stdout writer rb 不断打印一些东西 usr bin en
  • 如何在 Ruby 中动态调用访问器方法[重复]

    这个问题在这里已经有答案了 不管这是否是好的做法 我如何在 Ruby 中动态调用访问器方法 这是一个示例类 class Test Class attr accessor a b end 我可以使用 Object send 方法来读取变量 i
  • 启动同一作业的多个延迟作业进程

    我在运行多个工作人员的设置中使用延迟作业 就我的问题而言 这并不重要 但假设我运行 10 个工作线程 当前在开发模式下执行此操作 我遇到的问题是两个不同的工作人员有时开始处理同一项工作 调用我的工作对象上的执行方法 据我所知 延迟作业正在使
  • ruby中如何将binary32转换为float

    我有一个以 IEEE 32 编码的 binary32 如何将 0x0040EDC2 转换为 118 625 我尝试了几种打包和解包选项 但没有成功 IEEE http en wikipedia org wiki Single precisi
  • 通过 SO_RCVTIMEO 套接字选项在 Ruby 中设置套接字超时

    我试图通过 SO RCVTIMEO 套接字选项在 Ruby 中设置套接字超时 但它似乎对任何最近的 nix 操作系统都没有影响 使用 Ruby 的 Timeout 模块不是一个选择 因为它需要为每个超时生成和连接线程 这可能会变得昂贵 在需
  • 由于 MIME 类型不受支持,拒绝应用样式

    我不断收到一条错误消息 指出 MIME 类型 text html 不可执行或不是受支持的样式表 MIME 类型 并且启用了严格的 MIME 检查 我的链接代码是
  • 如何从数组中提取特定元素?

    如果我有一个数组a 1 2 3 4 5 6 7 8 9 10 我想要这个数组的一个子集 第 1 个 第 5 个和第 7 个元素 是否可以通过简单的方式从该数组中提取这些内容 我在想这样的事情 a 0 4 6 1 5 7 但这行不通 还有一种
  • 自动加载常量时检测到循环依赖

    我将 Rails 从版本 3 1 2 运行良好 升级到 4 0 并遇到以下错误 circular dependency detected while autoloading constant Foo 我创建了一个类ProductFactor
  • ArgumentError:Ruby 中的参数数量错误

    试图解决这个问题 class Person def initialize name name name end def greet other name puts Hi other name my name is name end end
  • 缺少带有 {:locale=>[:en], :formats=>[:html], 的模板布局/邮件程序

    我正在关注 Michael harlt Rails 教程 但出现此错误 缺少带有 locale gt en formats gt html variants gt handlers gt raw erb html builder 的模板布局
  • 选择的 xpath 父属性

    xml文档的语法
  • 如何使用 ROR 设置控制器页面内的文本区域属性[重复]

    这个问题在这里已经有答案了 任何人都可以解决我的小问题吗 实际上我想在页面加载并检查某些条件后设置文本区域启用 让我来解释一下我的故事实际上是我想要的 Story 我有一个博客页面 当用户登录并进入博客页面时 应该启用文本区域来发表评论 如

随机推荐

  • 拉伸背景图片CSS?

    td class style1 align center height 35 div style width 230px a class link span span a div td
  • 用于语义分割的 ImageDataGenerator

    我正在尝试使用 Keras 进行语义分割 并且在尝试加载图像时出现此错误flow from directory method Found 0 images belonging to 0 classes Found 0 images belo
  • 连接两条线段

    给定两条 2D 线段 A 和 B 如何计算连接 A 和 B 的最短 2D 线段 C 的长度 考虑两条线段 A 和 B 分别由两个点表示 线A由A1 x y A2 x y 表示 线 B 由 B1 x y B2 x y 表示 首先使用此算法检查
  • 如何迭代 JSON 结构? [复制]

    这个问题在这里已经有答案了 我有以下 JSON 结构 id 10 class child of 9 id 11 classd child of 10 如何使用 JavaScript 迭代它 var arr id 10 class child
  • 为什么 lambda 中的短路不起作用?

    为什么 linq 仍然尝试检查第二个表达式 Where t gt String IsNullOrEmpty someNullString t SomeProperty gt Convert ToDecimal someNullstring
  • 如何使用 Spring Boot 和嵌入式 Tomcat 禁用 TLSv1.0?

    我想用 spring boot 版本 1 3 3 停用 TLS 1 0 但如果 application yml 如下所示 它不起作用 ssl protocol TLSv1 2 key store E key server jks key s
  • 用于批量插入的触发触发器

    ALTER TRIGGER dbo TR O SALESMAN INS ON dbo O SALESMAN AFTER INSERT AS BEGIN SET NOCOUNT ON added to prevent extra result
  • 我应该扩展 ArrayList 以添加不为 null 的属性吗?

    我想将对象集合添加到 arrayList 前提是特定属性不为空 我正在考虑扩展 ArrayList 并在子类中实现检查 一种替代方法是在将属性放入 Arraylist 之前检查该属性 但这意味着 如果我需要根据逻辑将对象添加到 arrayl
  • 什么是 UIViewController

    我知道什么是UIView是但不是UIViewController 我只是想知道我可以用它做什么 以及它与UIView 基本上你需要知道什么是模型 视图 控制器架构在软件工程领域 UIView对应于该架构的视图并且UIViewControll
  • 带有手动词法分析器的 ANTLR 解析器

    我正在将基于 C 的编程语言编译器从手动词法分析器 解析器迁移到 Antlr Antlr 一直让我头疼 因为它通常mostly可以 但有些小部分却不能 而且解决起来非常痛苦 我发现我的大部分头痛都是由 Antlr 的词法分析器部分引起的 而
  • Twisted 的 Python Jabber/XMPP 客户端库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在寻找一个使用 Twisted 框架编写 Jabber XMPP 客户端的 Python 库 Wokkel是你最好的选择 它是对 Twisted 内置的核心 Twisted Wo
  • document.body.scrollHeight 在 firefox/chrome 中产生两个不同的结果

    我试图访问整个页面的高度 包括滚动 在 Chrome 中 document body scrollHeight 就是这样做的 在 Firefox 中 这不起作用 Firefox 中的等效项是什么 肯定开始使用 jquery 访问 docum
  • 如何在ie11上查看webp格式

    有没有办法在 IE11 上查看 webp 图像格式 或者可以在此浏览器上使用 javascript 代码将其转换为其他格式 我尝试了 图片 元素 但似乎它不能像 Chrome 62 那样工作 This也是一个非常易于使用且有效的polyfi
  • 如何使屏幕的表格居中(垂直和水平)

    我有这些代码块 table border 1px tr td my content td tr table 我想在屏幕中央显示我的表格 垂直和水平 这是一个演示 我怎样才能做到这一点 水平居中很容易 您只需将两个边距设置为 自动 table
  • Union-Find:有效检索集合的所有成员

    我正在与一个union find算法 在我的程序的第一部分中 算法计算一个大集合的分区E 之后 我想检索该集合的所有成员S 其中包含给定节点x 到目前为止 我天真地测试了所有元素的成员资格E到集合S 但昨天我正在阅读 算法导论 CLRS 着
  • 如何设置相对于祖父母元素而不是直接父元素的宽度?

    我正在尝试设置一些元素的宽度相对于祖父母元素宽度的百分比 像这样 div class grand div class parent div class child1 div div class div div div
  • Sonar:如何使用 try-with-resources 关闭 FileOutputStream

    声纳给出一个错误 这FileOutputStream应该关闭 我需要修改以下代码才能使用try with resources 我该怎么做呢 public void archivingTheFile String zipFile byte b
  • 调用者会阻塞,直到 getFoo() 准备好值为止?

    我有一个JavaThread它公开了其他线程想要访问的属性 class MyThread extends Thread private Foo foo Foo getFoo return foo public void run foo ma
  • 如果我没有指定使用 CPU/GPU,我的脚本使用哪一个?

    在 pytorch 中 如果我没有写任何关于使用 CPU GPU 的内容 并且我的机器支持 CUDA torch cuda is available True 我的脚本使用的是 CPU 还是 GPU 如果是CPU 我该怎么做才能让它在GPU
  • Sinatra 助手伪造请求

    Summary 在一个SinatraWeb 应用程序 如何向应用程序发出虚拟请求并以文本形式获取响应正文 例如 这些路线 get foo foo get bar spoof request foo bar 当使用网络浏览器请求 bar 时