imroc / req

Simple Go HTTP client with Black Magic
https://req.cool
MIT License
4.12k stars 334 forks source link

怎么保证header不被添加内容呢 #356

Closed owwkmidream closed 1 month ago

owwkmidream commented 1 month ago

在OnBeforeRequest中间件和DevMode dump出来的信息,都没有发现多余的header,但是使用抓包软件就看见每次都自己添加了一个 Accept-Encoding: gzip

由于客户端指纹的问题,我希望header仅出现我指定的字段,并且进行自定义排序,这个多出的Accept-Encoding: gzip破坏了指纹。

owwkmidream commented 1 month ago

补充:在此最小示例里,dump可以看见多出来的Accept-Encoding: gzip,但是我的实际项目里面dump看不见,我已经尽量复现但是复现不出来

如图 image image Dump

2024/05/22 20:47:36.524953 DEBUG [req] HTTP/1.1 POST https://httpbin.org/post
POST /post HTTP/1.1
Content-Type: application/json
User-Agent: my-ua
My-Headers: 1.30
charset: UTF-8
Content-Encoding: deflate
Content-Length: 17
Host: httpbin.org

最小复现示例:

package main

import (
    "fmt"
    "github.com/imroc/req/v3"
    "strconv"
)

func main() {
    cli := req.DevMode().EnableForceHTTP1()
    // 中间件
    cli.OnBeforeRequest(func(client *req.Client, req *req.Request) error {
        fmt.Println("请求头:")
        for k, v := range req.Headers {
            fmt.Printf("%s: %s\n", k, v)
        }

        return nil // return nil if it is success
    })
    // 代理抓包地址
    cli.SetProxyURL("http://127.0.0.1:9000")

    var headers = map[string]string{
        "Content-Type":     "application/json",
        "User-Agent":       "my-ua",
        "charset":          "UTF-8",
        "My-Headers":       "hello",
        "Content-Encoding": "deflate",
        "Content-Length":   "",
        "Host":             "httpbin.org",
    }
    var data = []byte(`{"hello":"world"}`)
    headers["User-Agent"] = "new-my-ua"
    headers["Content-Length"] = strconv.Itoa(len(data))

    var resp map[string]interface{}
    reqs := cli.Post("https://httpbin.org/post").
        SetHeaderOrder(
            "Content-Type",
            "User-Agent",
            "charset",
            "My-Headers",
            "Content-Encoding",
            "Content-Length",
            "Host",
        )
    for k, v := range headers {
        reqs.SetHeaderNonCanonical(k, v)
    }

    reqs.SetBodyBytes(data).
        SetSuccessResult(&resp).
        Do()

    for k, v := range resp["headers"].(map[string]interface{}) {
        fmt.Println(k, v)
    }
}
imroc commented 1 month ago

DevMode dump 出来的是可以看到的,我用你的代码都可以

image

owwkmidream commented 1 month ago

DevMode dump 出来的是可以看到的,我用你的代码都可以

image

是的,我复现不出来,项目里dump的信息,header后没有跟着一个空行直接就是body了,也看不见这个多出来的Accept-Encoding: gzip。

由于客户端指纹的问题,我希望header仅出现我指定的字段,这个有办法实现吗

imroc commented 1 month ago

我希望header仅出现我指定的字段,这个有办法实现吗

暂时没有这个能力,但是如果想不自动加 Accept-Encoding 可以这样设置下:

client.DisableCompression()
owwkmidream commented 1 month ago

我希望header仅出现我指定的字段,这个有办法实现吗

暂时没有这个能力,但是如果想不自动加 Accept-Encoding 可以这样设置下:

client.DisableCompression()

okk,暂时解决了,感谢。不过现在有了header order,也希望未来能够增加header仅出现指定字段的能力!!