我是否正确解析此 HTTP POST 请求?

2023-12-02

首先我要说的是,我正在使用twisted.web框架。Twisted.web的文件上传没有像我想要的那样工作(它只包含文件数据,而不包含任何其他信息),cgi.parse_multipart没有像我想要的那样工作(同样的事情,twisted.web使用此功能),cgi.FieldStorage不起作用(因为我是通过twisted而不是CGI接口获取POST数据——据我所知,FieldStorage尝试通过 stdin 获取请求),并且twisted.web2对我不起作用,因为使用Deferred让我感到困惑和愤怒(对于我想要的来说太复杂了)。

话虽这么说,我决定尝试自己解析 HTTP 请求。

使用 Chrome,HTTP 请求的构成如下:

------WebKitFormBoundary7fouZ8mEjlCe92pq
Content-Disposition: form-data; name="upload_file_nonce"

11b03b61-9252-11df-a357-00266c608adb
------WebKitFormBoundary7fouZ8mEjlCe92pq
Content-Disposition: form-data; name="file"; filename="login.html"
Content-Type: text/html

<!DOCTYPE html>
<html>
  <head> 

...

------WebKitFormBoundary7fouZ8mEjlCe92pq
Content-Disposition: form-data; name="file"; filename=""


------WebKitFormBoundary7fouZ8mEjlCe92pq--

它总是这样形成的吗?我用正则表达式解析它,如下所示(请原谅代码墙):

(注意,我剪掉了大部分代码,只显示我认为相关的内容(正则表达式(是的,嵌套括号),这是一个__init__方法(迄今为止唯一的方法)Uploads我构建的类。完整的代码可以在修订历史中看到(我希望我没有匹配任何括号)

if line == "--{0}--".format(boundary):
    finished = True

if in_header == True and not line:
    in_header = False
    if 'type' not in current_file:
        ignore_current_file = True

if in_header == True:
    m = re.match(
        "Content-Disposition: form-data; name=\"(.*?)\"; filename=\"(.*?)\"$", line)
    if m:
        input_name, current_file['filename'] = m.group(1), m.group(2)

    m = re.match("Content-Type: (.*)$", line)
    if m:
        current_file['type'] = m.group(1)

    else:
        if 'data' not in current_file:
            current_file['data'] = line
        else:
            current_file['data'] += line

您可以看到,每当达到边界时,我都会启动一个新的“文件”字典。我设置in_header to True说我正在解析标头。当我到达一个空行时,我将其切换到False-- 但不是在检查是否Content-Type已设置为该表单值 - 如果没有,我设置ignore_current_file因为我只是在寻找文件上传。

我知道我应该使用一个库,但是我厌倦了阅读文档,尝试在我的项目中使用不同的解决方案,并且仍然让代码看起来合理。我只是想跳过这一部分——如果解析带有文件上传的 HTTP POST 如此简单,那么我将坚持下去。

注意:此代码目前工作正常,我只是想知道它是否会阻塞/吐出来自某些浏览器的请求。


我对这个问题的解决方案是使用 cgi.FieldStorage 解析内容,如下所示:

class Root(Resource):

def render_POST(self, request):

    self.headers = request.getAllHeaders()
    # For the parsing part look at [PyMOTW by Doug Hellmann][1]
    img = cgi.FieldStorage(
        fp = request.content,
        headers = self.headers,
        environ = {'REQUEST_METHOD':'POST',
                 'CONTENT_TYPE': self.headers['content-type'],
                 }
    )

    print img["upl_file"].name, img["upl_file"].filename,
    print img["upl_file"].type, img["upl_file"].type
    out = open(img["upl_file"].filename, 'wb')
    out.write(img["upl_file"].value)
    out.close()
    request.redirect('/tests')
    return ''
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我是否正确解析此 HTTP POST 请求? 的相关文章

随机推荐

  • 使用 Jquery Mobile 进行 XML 解析

    我有以下格式的 XML 我想提取 标题 和 子菜单 标签 并从中创建一个菜单栏结构 如下图所示
  • 如何处理龙卷风中的帕尔斯指令?

    我是龙卷风框架的新手 当我打开网址时torchado web RequestHandler 需要处理 parms 的字典 请看下面的代码 class MainHandler tornado web RequestHandler def ge
  • 使用 log4j2 的多个线程的不同日志文件

    我正在运行一个 Java 应用程序 其中调用多个线程 每个线程都有一些唯一的名称 现在我想为每个日志文件创建多个日志文件 日志文件的名称应该与线程名称相同 使用 log4j2 可以吗 请帮我写log4j2配置文件 先感谢您 我同意 Rout
  • 用户提交的 HTML 带来的安全风险

    我正在使用 contentEditable div 它允许用户编辑正文 HTML 然后使用 AJAX 请求将其直接发布到网站 当然 我还要对其进行一些安全检查 最明显的是通过搜索确保没有提交任何脚本标签
  • 如何修复 Eclipse/Android 安装?图形 XML 编辑器中的 PNG 加载问题

    很长一段时间以来 我的带有 Android 插件的 Eclipse 环境都运行顺利 在软件更新过程中应用的更新的某个地方 它崩溃了 开始发生的第一个问题是在运行布局文件的 Android 插件图形编辑器时丢失 按钮 Form Widget
  • 如何访问 R 中的嵌套 SQL 表?

    来自 R Studio 的ODBC 数据库文档我可以看到一个如何将 SQL 表读入 R 数据框的简单示例 data lt dbReadTable con flights 让我粘贴一个图形BGBUreftable 我正在尝试读取 R 数据帧
  • 将ScheduledJob注册为系统帐户(无需传入凭据)

    我相信对于Register ScheduledTask你可以指定 User System 或者做类似的事情 principal New ScheduledTaskPrincipal UserId SYSTEM LogonType Servi
  • 通过递增/递减最后找到的值向前/向后填充 na?

    给定以下 pandas 数据框 可以找到它的副本here 如何在单独的列中填充 na 并递增 递减 nr 行 直到下一个信号值和前向 后向信号值 信号值只有 1 1 或 np na Values Signal 0 1420 49 1 142
  • 使用 Javascript forEach 和 indexOf 在 JSON 中搜索多个过滤器

    我有 JSON 格式的数据 需要在其中执行搜索 有不同的可用标签 当我单击它们时 它会在 JSON 中搜索并返回具有这些标签的项目 为此 我使用了 js 函数 它第一次工作正常 但是当我在函数中推送第二个过滤器时 它返回错误的数据 可用的过
  • RFC_READ_TABLE 传递“选项”和“字段”参数 (c#)

    需要帮助 我正在尝试使用 RFC READ TABLE 从 SAP 获取销售数据 但不知道如何将 OPTIONS 和 FIELDS 参数传递给 SAP 这是我的应用程序的示例代码 连接正常 执行后出现异常 DATA BUFFER EXCEE
  • 有没有办法防止opencv矩阵除法的舍入

    我有一个整数矩阵 我想对其进行整数除法 但opencv总是对结果进行四舍五入 我知道我可以手动划分每个元素 但我想知道是否有更好的方法 Mat c Mat
  • TCP Keepalive 是确定断开链接的唯一机制吗?

    我最近遇到了一个问题 TCP 服务器和客户端之间的中间链路出现故障 如果主服务器宕机 客户端需要连接到辅助服务器 当主服务器被关闭时 例如 通过在终端上执行 C TCP 关闭序列会通过 并且客户端成功检测到断开的链接并尝试辅助服务器 然而
  • Tomcat 7 上部署时出现 Omnifaces 异常

    我正在尝试将 Omnifaces 2 1 添加到 Web 应用程序以使用 FullAjaxExceptionHandler 以及 Omnifaces 2 1 中可能的其他功能 我已阅读并关注了 BallusC 的以下帖子 但仍然陷入困境 如
  • 格式良好的 XML?标记名称和属性名称中的 XML 引用

    我一直在尝试确认我对 XML 规范的阅读 我的解释是 标签名称和属性名称中不允许使用预定义实体和数字字符引用 例如 XML 1 0 规范不允许这样做
  • MS Edge:IntersectionObserver。对你起作用吗?

    在任何人在这里付出太多努力之前 我已经有了一个令人讨厌的解决方法 我只是想知道是否有人可以使用它 Edge 版本 15 现已发布 并支持交叉观察器 用于延迟加载 我已经实现了它 它在所有支持它的浏览器中都可以正常工作 Chrome 和 Op
  • Rails 随机记录生成器

    我问自己是否有一个gem或一种方法可以用随机数据生成大量记录 对模型有效 目标是使用数据库中的大量数据来测试我的应用程序 我在网上没有找到任何内容 但我没有使用正确的关键字 你知道类似的事情吗 您可以使用Faker宝石 并且 以下是创建 1
  • 如何将查询语句记录到Neo4j服务器,可能吗?

    我想将整个查询语句记录到 Neo4j 服务器 但是 在搜索 SO 和文档之后我没有成功 我发现这个问题 Neo4j 服务器上记录的剩余查询 但是更改这些配置设置并没有达到我所希望的效果 我在 Golang 工作并使用Go CQ库与 Neo4
  • 如何让 Twitter Bootstrap Accordion 保持一组开放?

    我正在尝试使用 Twitter 引导程序使用手风琴和折叠插件来模拟 Outlook 栏 到目前为止 我已经实现了折叠和手风琴工作 但它目前允许折叠所有部分 我想限制它 以便始终显示一个且仅一个 这是我正在研究的一个 http jsfiddl
  • 用于在 JSON 数组中查找元素的索引

    我有一个看起来像这样的表 CREATE TABLE tracks id SERIAL artists JSON INSERT INTO tracks id artists VALUES 1 name blink 182 INSERT INT
  • 我是否正确解析此 HTTP POST 请求?

    首先我要说的是 我正在使用twisted web框架 Twisted web的文件上传没有像我想要的那样工作 它只包含文件数据 而不包含任何其他信息 cgi parse multipart没有像我想要的那样工作 同样的事情 twisted