【问题标题】:Upload: 500 Internal Server Error上传:500 内部服务器错误
【发布时间】:2015-09-21 22:28:48
【问题描述】:

致任何偶然发现此问题的人:这是关于 Pushbullet API 的,已标记。

第一次尝试。

我的上传请求似乎得到了很好的响应,而且我很确定我有正确的上传 URL,但上传阶段一直失败。

代码是 VB6,使用 MSXML2.XMLHTTP 实例进行发送:

With XMLHTTP
    .open "POST", UploadUrl, True
    .setRequestHeader "Access-Token", AccessToken
    .setRequestHeader "Content-Type", "multipart/form-data; boundary=" & ContentBoundary
    .onreadystatechange = Me
    .send MultipartFormBody
End With

MultipartFormBody 是一个字节数组,所以没有任何东西被转码为 UTF-8。 ContentBoundary 是与正文数据一起生成的字符串。 UploadUrl 是一个字符串,其值在前一个(上传请求)响应中返回。 XMLHTTP 自动创建 Content-Length 标头。

据我所知,邮件正文的格式也正确。当我在后者中出现缺陷时,我收到了一条错误消息,这对纠正它很有帮助。

--PushbulletReporter_3E43228zZz82234E3{CRLF}
Content-Disposition: form-data; name="file"; filename="capture.png"{CRLF}
Content-Type: image/png{CRLF}
{CRLF}
{bytes of a PNG image}--PushbulletReporter_3E43228zZz82234E3--{CRLF}

但现在我收到 500 Internal Server Error 错误消息“发生未处理的服务器错误。”

主体是 3.5KB 以下的一根头发。我的想法是......这里可能需要分块编码?

有什么线索吗?还有哪些信息可能会有所帮助?

【问题讨论】:

  • 服务器的日志可能会有所帮助。
  • 在最坏的情况下你应该得到 400,而不是 500,我会看看我是否能找到问题所在。

标签: pushbullet


【解决方案1】:

首先我要为文件上传的事情道歉,遗憾的是,multipart/form-data 很难实际创建,因为很少有语言有这样做的标准库。我有一个版本,你可以直接上传字节,但还没有准备好发布。

我在日志中看到一些“意外的 EOF”错误,所以我只能假设这就是这里发生的事情。我还没有运行任何测试,但我认为你没有足够的 {CRLF} 或其他一些小错误。如果您可以使用现有库创建编码数据,然后将其与您的输出进行比较,那将是理想的。

在这种情况下,我会尝试让服务器返回 400,但我想这将是“无效的多部分正文”。

我做了一个测试脚本,看起来缺少 CRLF 是问题所在:

--d3880c80febbef19d78c6daf83da33d6b973d2524d9a6146e4bc71f4973b\r\nContent-Disposition: form-data; name=\"file\"; filename=\"filename\"\r\nContent-Type: application/octet-stream\r\n\r\n{bytes of a PNG image}\r\n--d3880c80febbef19d78c6daf83da33d6b973d2524d9a6146e4bc71f4973b--\r\n

注意PNG图像部分字节后的CRLF,我认为你错过了那些

【讨论】:

  • 我会看看那个,因为它看起来很合理,这是我第一次尝试将这个手动逻辑的 multipart/form-data 输出扔到一个真实的服务器上。当我仔细研究相关的 RFC 时,也许我只是错过了那个 CRLF。谢谢,我会眯着眼睛去报告。
  • 就是这样!感谢您弄清楚。我还遇到了似乎是众所周知的 UrlMon(Microsoft,IE 的 HTTP/FTP 传输层堆栈)问题,其中接收 204 No Content 的非 GET 方法报告状态为 1223 Unknown 且响应标头不可用。 :( 但是很容易破解。据我所知,他们的 WinHTTP 堆栈具有相同的缺陷(或功能?)。
  • 不相关的 FYI:微软的 HTTP 堆栈在 Windows 8 之前没有为原生代码应用程序提供 WebSocket 支持,它似乎被硬塞进了他们的 WinHTTP 库。因此,由于许多人将在 Win7 上停留多年并且也不会将所有内容都迁移到 .Net,因此人们需要 3rd 方库来支持 WebSocket。
  • 哎哟。去去平台。有一个未记录的(因为使用起来更烦人)HTTP 流式端点: curl --no-buffer stream.pushbullet.com/streaming/<access token> 如果您能够读取 HTTP 流式响应,则可以尝试。
  • 很高兴了解 204,我想我不会像其他地方那样使用 204,除了这个电话,所以以后人们不应该遇到这个问题。
猜你喜欢
  • 2012-10-12
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
  • 2015-10-11
相关资源
最近更新 更多