flutter - 通过 HAProxy 从颤振到 IPFS 的 REST 调用不起作用
问题描述
背景:
我在 HAProxy 服务器后面设置了一个 IPFS 服务器。我写了一个 Flutter 客户端通过代理连接到这个 IPFS 服务器并添加一个文件。
问题:
当我将 Flutter 客户端作为桌面应用程序(在 Macos 上)运行时,一切都按预期工作,但是当我将 Flutter 客户端作为 Web 应用程序运行时,出现 403 错误。
细节:
成功调用的标头(通过 tcpdump 捕获)如下:
REQUEST:
POST /api/v0/add HTTP/1.1
Host: po.segito.net
User-Agent: Dart/2.11 (dart:io)
Accept-Encoding: gzip
Content-Type: multipart/form-data; boundary=dart-http-boundary-fmjPP-TIwnDcY7pJGniid4grt9mdDADtazmb7Pm8sP_PRJkV1oY
Content-Length: 39611
--dart-http-boundary-fmjPP-TIwnDcY7pJGniid4grt9mdDADtazmb7Pm8sP_PRJkV1oY
content-type: application/octet-stream
content-disposition: form-data; name="asset"
RESPONSE:
HTTP/1.1 200 OK
Access-Control-Allow-Headers: X-Stream-Output, X-Chunked-Output, X-Content-Length
Access-Control-Expose-Headers: X-Stream-Output, X-Chunked-Output, X-Content-Length
Content-Type: application/json
Server: go-ipfs/0.6.0
Trailer: X-Stream-Error
Vary: Origin
X-Chunked-Output: 1
Date: Sat, 07 Nov 2020 09:48:28 GMT
Transfer-Encoding: chunked
不成功调用的标头如下:
REQUEST:
POST /api/v0/add HTTP/1.1
Host: po.segito.net
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:82.0) Gecko/20100101 Firefox/82.0
Accept-Encoding: gzip, deflate, br
Content-Type: multipart/form-data; boundary=dart-http-boundary-HvcRoK0lGd4+oahuNaOejbIBd-cID5+0n3GFvwwOY4ZqfitRP1s
Content-Length: 39611
--dart-http-boundary-HvcRoK0lGd4+oahuNaOejbIBd-cID5+0n3GFvwwOY4ZqfitRP1s
content-type: application/octet-stream
content-disposition: form-data; name="asset"
RESPONSE:
HTTP/1.1 403 Forbidden
Content-Type: text/plain; charset=utf-8
Vary: Origin
X-Content-Type-Options: nosniff
Date: Sat, 07 Nov 2020 09:38:55 GMT
Content-Length: 16
403 - Forbidden
笔记:
- 不存在 CORS 问题,因为所有文件和 REST 调用(包括 Flutter HTML 文件)都通过同一个 HAProxy 服务器提供服务。
- HAProxy 是 SSL 终结器。
- CURL 请求按预期工作。
- 通过 HAProxy 的所有其他 REST 调用按预期工作。
解决方案
推荐阅读
- nginx - 在代理和从上游读取时,使 NGINX “失败(111:连接被拒绝),udp”
- android - 使用不同货币的计费客户订阅
- html - 在 Fetch 语句中获取 React Js 中的用户输入
- php - Symfony 中序列化服务的问题:不允许序列化“SimpleXMLElement”
- python - 需要帮助使用 Python 检索 Google cloudSQL 元数据和日志
- apostrophe-cms - 将预定义的小部件添加到主页
- kubernetes - 带有后缀的 Kubernetes Ingress 后端路径
- php - 使用 phpmailer 通过电子邮件发送 html 页面
- azure - Azure DevOps 管道卡住
- r - ggplot将y轴数值更改为文本