This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SIMPLELINK-CC32XX-SDK:HttpClient_sendRequest 函数发送额外的 CRLF

Guru**** 1129500 points
Other Parts Discussed in Thread: CC3235MODSF
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1161000/simplelink-cc32xx-sdk-httpclient_sendrequest-function-sends-extra-crlf

器件型号:SIMPLELINK-CC32XX-SDK
主题中讨论的其他器件:CC3235MODSF

您好!

我们正在使用 CC3235MODSF 和最新的 Simplelink SDK 版本:6.10.00.05进行开发。 我们正在应用程序中使用 HTTP GET 和 POST 请求。

在比较 Wireshark 捕获的通过 CC3235MODSF 和 Postman 发送这些请求时、我们意识到 CC3235MODSF 正在发送额外的 HTTP "继续"数据包。 该数据包基本上是在实际 HTTP 请求后向服务器发送 CRLF (2字节):

下面是 Wireshark 上的不同屏幕截图:

在查看了 httpclient.c 中的代码后、我可以看到 HttpClient_sendRequest 函数调用静态 sendRequest 函数、在该函数中、发送正文的部分如下:

/* in case a body exists send it */
if(body)
{
    /* In case of chunk, add the chunk length add the beginning of the body */
    if ((flags & HTTPClient_CHUNK_START) || (getCliState(cli, CHUNKED_REQ_STATE)))
    {
        ret = sprsend(cli, 0, "%x \r\n",bodyLen);
        if (ret < 0)
        {
            return (ret);
        }
    }
    /* Send the buf */
    ret = sprsend(cli, SENDBUF,NULL);
    if (ret < 0)
    {
        return (ret);
    }
    /* Send the body payload */
    while(bytesToSend != 0)
    {
        ret = SlNetSock_send(cli->ssock, bodyPtr, bytesToSend, 0);
        if (ret < 0)
        {
            return (ret);
        }
        bytesToSend-=ret;
        if (ret < bytesToSend)
        {
            bodyPtr+=ret;
        }
    }
    ret = sprsend(cli, 0, "\r\n");
    if (ret < 0)
    {
        return (ret);
    }
    if (flags & HTTPClient_CHUNK_START)
    {
        setCliState(cli,CHUNKED_REQ_STATE,true);
    }
    else if (flags & HTTPClient_CHUNK_END)
    {
        ret = sprsend(cli, 0, "0\r\n\r\n");
        if (ret < 0)
        {
            return (ret);
        }
        setCliState(cli,CHUNKED_REQ_STATE,false);
        waitBlocked = true;
    }
    /* Send the buffer */
    ret = sprsend(cli, SENDBUF,NULL);
    if (ret < 0)
    {
        return (ret);
    }
}
else
{
    /* There is no body, send the start line and headers */
    ret = sprsend(cli, SENDBUF,NULL);
    if (ret < 0)
    {
        return (ret);
    }
}

您可以在上面的第33行(httpclient.c 上的第2263行)上看到有一个使用 CRLF 进行 sprintd 的调用。 如果我注释此行、我将不再看到额外的 CRLF 继续数据包。

那么、我们为什么要使用这行代码呢? 这是错误吗? 请求分块时是否需要此数据包? 如果没有必要、我看不到发送额外字节数据的任何原因。

非常感谢你的帮助。

最棒的

欧格尔肯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我不知道为什么添加了它、但正如您在这里看到的(例如 https://docs.citrix.com/en-us/citrix-adc/current-release/appexpert/http-callout/http-request-response-notes-format.html)、它应该是无害的。

    如果这非常重要、我可以尝试找出答案。

    此致、

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不认为向服务器发送不必要的数据是无害的、因为它会使用不必要的资源。  

    此外、我不是在谈论请求的结束。 请求结束时已有换行符。 这行代码发送另一个仅包含 CRLF 的额外数据包。 这会导致某些服务器将此数据包解释为新请求。

    因此、请找出原因、因为这绝对不会造成损害。

    最棒的

    欧格尔肯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、感谢您的更新。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、您对该问题是否有任何更新?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    目前还没有更新、因为我没有得到研发部门的任何回复

    我今天要对它们执行 ping 操作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我回到了代码推出的时间、它从第1天起就出现在那里。

    从我记忆中、我们观察到一些 HTTP 服务器(主要是 V1.0)的问题、这些服务器在 CR/LF 缺失时拒绝了请求。 也许这就是添加它的原因。

    我再次认为,除了服务器端的额外处理之外,如果它不会在服务器端引起任何异常,它可能保持不变。

    如果您有任何疑问、请告诉我。

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Shlomi、

    感谢您的回答。 但是,我必须告诉你,这种做法远没有帮助。

    我知道代码是从第1天开始的。 这不会改变额外 CRLF 传输不是必需的、它会使用不必要的资源。 在每个 HTTP 请求中发送2字节无用的 HTTP 数据(根据 Wireshark、这是56字节的 WiFi 数据)、毫无理由地使用大量资源。 这不仅涉及处理服务器端的额外数据。 想象一下、电池供电的手持设备每隔几秒就会毫无理由发送额外的字节。 我不打算计算该过程的额外功耗、但我希望您能理解这绝对是一个问题、不应保持原样。

    当 HTTP GET 请求从浏览器和 TI CC3235MODSF 发送到同一服务器时、我会附加下面的 Wireshark 捕获。 您可以轻松地看到它在服务器端造成的差异和错误。 请尝试找到此问题的解决方案吗?

    https://drive.google.com/drive/folders/1No6kXyUbRD1T9YDYOrefVrUFnrSJ-wLv?usp=sharing

    谢谢、

    欧格尔肯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在这里不要误会我的意思、我同意您对这个部分的看法、我将在内部与团队一起确保它不会中断任何事情、但这里的解决方案可能与您在开始时所说的一样、即从代码中删除这个额外的 CR/LF。

    目前、下一个 SDK 版本有一个测试周期、因此不确定它能否满足目标、因此最新版本将是下一季度发布版本。

    此致、

    Shlomi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我不认为我给你错了。 您在之前的消息中没有提到此问题将在本季度或下一季度发布中得到解决。

    非常感谢您的帮助。

    最棒的

    欧格尔肯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当然、我在内部分配了它、并在我们解决它后通知您。