Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 未为具有空/零负载的修补程序请求设置内容长度标头-GoLang_Http_Go_Content Length_Http Content Length - Fatal编程技术网

Http 未为具有空/零负载的修补程序请求设置内容长度标头-GoLang

Http 未为具有空/零负载的修补程序请求设置内容长度标头-GoLang,http,go,content-length,http-content-length,Http,Go,Content Length,Http Content Length,我观察到,对于具有空/nil负载的修补程序请求,未设置内容长度头。即使我们通过req.Header.set(“content length”,“0”)手动设置它,它实际上也不会在外出请求中设置。 这种奇怪的行为(Go bug?)只会发生在补丁请求和负载为空或为零(或设置为http.NoBody)时 即使在最新的go版本1.15中,这也是可以复制的。 只需在一个简单的http服务器上运行上述代码,并亲自查看 是否有任何解决方案/解决方法可以发送内容长度设置为0的修补程序请求?您可以通过将Trans

我观察到,对于具有空/nil负载的修补程序请求,未设置内容长度头。即使我们通过
req.Header.set(“content length”,“0”)
手动设置它,它实际上也不会在外出请求中设置。 这种奇怪的行为(Go bug?)只会发生在补丁请求和负载为空或为零(或设置为http.NoBody)时

即使在最新的go版本
1.15
中,这也是可以复制的。 只需在一个简单的http服务器上运行上述代码,并亲自查看


是否有任何解决方案/解决方法可以发送内容长度设置为0的修补程序请求?

您可以通过将Transferncode设置为
identity
来告诉HTTP客户端包含一个值为0的
内容长度
头,如下所示:

url:=”http://localhost:9999"
方法:=“修补程序”
客户端:=&http.client{}
req,err:=http.NewRequest(方法,url,http.NoBody)
如果出错!=零{
恐慌(错误)
} 
req.transferncode=[]字符串{“标识”}
请求头集合(“授权”、“持有人我的令牌”)
//请求标题集(“内容长度”、“0”)
请注意对原始代码的以下更改:

  • 重要的一个
    req.transferncode=[]字符串{“标识”}
  • 指定空正文的惯用方法:
    http.NoBody
    (不影响发送长度)
  • 注释掉
    req.Header.Set(“内容长度”,“0”)
    ,客户机自己填写
  • 如果出现错误,也会变成恐慌,您可能不想继续
identity
的传输编码未写入请求,因此除了头
Content Length=0
之外,请求看起来与以前相同

不幸的是,这没有被记录(请随时向Go团队提交问题),但可以在以下代码中看到:

繁琐的细节

检查以下内容以写入
内容长度
标题:

//写入值为a的内容长度和/或传输编码
//消毒字段三元组的功能(主体、内容长度、,
//(编码)
如果t.shouldSendContentLength(){
如果2;,err:=io.WriteString(w,“内容长度:”);err!=nil{
返回错误
}
如果u2;,err:=io.WriteString(w,strconv.FormatInt(t.ContentLength,10)+“\r\n”);err!=nil{
返回错误
}
然后,查看长度为零时的传输编码:

如果t.ContentLength==0&&isIdentity(t.TransferEncoding){
如果t.Method==“GET”| | t.Method==“HEAD”{
返回错误
}
返回真值
}
验证
transferncode
是否为准确的
[]字符串{“标识”}

func-isIdentity(te[]string)bool{return len(te)==1&&te[0]==“identity”})

如果没有
内容长度
也可以表示无正文。这不是客户端错误,如果处理不当则是服务器错误。另请参见@Marc Azure data lake gen2 storage API为此抛出错误。此外,明确声明可能忽略标头。然后他们的处理程序中有错误。I想象一下,微软在阅读RFC时遇到了困难。非常感谢,我正在分析代码,但没有看到通过操纵isIdentity()方法调用来解决此问题。再次感谢!!!
package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "strings"
)

func main() {

    url := "http://localhost:9999"
    method := "PATCH"

    payload := strings.NewReader("")
    client := &http.Client {
    }
    req, err := http.NewRequest(method, url, payload)

    if err != nil {
        fmt.Println(err)
    }
    req.Header.Set("Authorization", "Bearer my-token")
    req.Header.Set("Content-Length", "0") //this is not honoured

    res, err := client.Do(req)
    defer res.Body.Close()
    body, err := ioutil.ReadAll(res.Body)

    fmt.Println(string(body))
}