热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WS头信息KEY的大小写被强制替换,导致很多三方WS客户端连接失败问题

| Q | A| ------------------- | -----| Bug report? | yes| Swoft version

| Q | A
| ------------------- | -----
| Bug report? | yes
| Swoft version | 2.0.6
| Swoole version | 4.4.4
| PHP version | 7.2.20

在使用一些第三方的WS客户端库时候,发现swoft2的ws连接失败,使用其他框架可以正常连接。
抓包发现唯一差异在WS头信息KEY的大小写不同上,(Sec-WebSocket-Accept,Sec-WebSocket-Version,Sec-WebSocket-Protocol等)。
研究了下代码发现header方法的第三个参数$ucwords无效,默认null时还是默认做了KEY转换处理。
否则ucwords在true、false、null三种情况,为null时默认原始请求头。

1
2
php

public function header(string $key, $value, $ucwords = null){}

quickSend返还时header默认ucwords = null

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
php

public function quickSend(Response $response = null): void

    {

        $response = $response ?: $this;

        // Ensure coResponse is right

        $coResponse = $response->getCoResponse();

        // Write Headers to co response

        foreach ($response->getHeaders() as $key => $value) {

            $headerLine = implode(';', $value);

            if ($key === ContentType::KEY) {

                $headerLine .= '; charset=' . $response->getCharset();

                $coResponse->header($key, $headerLine);

            } else {

                $coResponse->header($key, $headerLine);

            }

        }

        // Write COOKIEs

        foreach ($response->COOKIEs as $n => $c) {

            $coResponse->COOKIE($n, $c['value'], $c['expires'], $c['path'], $c['domain'], $c['secure'], $c['httpOnly']);

        }

        // Set status code

        $coResponse->status($response->getStatusCode());

        // Set body

        $content = $response->getBody()->getContents();

        $coResponse->end($content);

        // Ensure sent

        $this->sent = true;

    }

该提问来源于开源项目:swoft-cloud/swoft

ok 谢谢。 我这考虑下怎么改


推荐阅读
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • 渗透测试基础bypass绕过阻挡我们的WAF(下)
    渗透测试基础-bypass ... [详细]
  • 一.常见基于身份识别进行反爬1通过headers字段来反爬headers中有很多字段,这些字段都有可能会被对方服务器拿过来进行判断是否为爬虫1.1通过headers中的User-A ... [详细]
  • \\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*if(string.IsNullOrEmpty(Tex ... [详细]
  • Cookie和Session的联系Cookie是在客户端保持状态,Session是在服务器端保持状态。由于服务器端保持状态在客户端也需要保存一个标识,所以Session需要借助于 ... [详细]
  • 应用场景B接口申请参数依赖于A接口返回的数据,心愿B接口发送申请的时候能获取A接口返回的数据作为申请参数。实现思路将A接口返回的数据通过后执行脚本赋值给一个全局变量或者环境变量。具体示例咱们一个接口B须要A接口返回的参数token作为本人的申请参数。常见的场景如:拜访一个须要登陆能力浏览的接口。1、准 ... [详细]
  • 简答题(每题5分):1、label标签是什么,for和accesskey属性有什么用?label标签是一种常见 ... [详细]
  • python学习笔记(3)cookie  session
    一、cookie&session1、cookie:cookie就是由服务器发送给客户端的特殊信息,而这些信息以文本的方式存放在客户端,然后 ... [详细]
  • 有时候网站sqlserver数据库被挂马了,网上的很多软件与方法都是针对text小于8000的,这里的方法貌似可行,需要的朋友可以参考下。 ... [详细]
  • 开发笔记:python之Bottle框架
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了python之Bottle框架相关的知识,希望对你有一定的参考价值。一、简单的Bottle框架1)bott ... [详细]
  • python requests登录_【Python数据分析】Python模拟登录(一) requests.Session应用
    最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂,所以一下卡在这里 ... [详细]
author-avatar
打篮球的乔巴
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有