Skip to content

Invalid host in HTTP header if setting host via service_name for channel inited by list or file  #1940

@thorneliu

Description

@thorneliu

Describe the bug (描述bug)
In brpc::PROTOCOL_HTTP, we will set the host field by service_name when

  • host is not explicitly set
  • host is not set in the url
    if (_options.protocol == brpc::PROTOCOL_HTTP) {
        URI& uri = cntl->http_request().uri();
        if (uri.host().empty() && !_service_name.empty()) {
            uri.SetHostAndPort(_service_name);
        }
    }

However, when the channel is inited via na_url shceme = list or file, such _service_name is not valid host field which
results in 400 BadRequest

To Reproduce (复现方法)
Init a channel with ipport list and http_request uri with relative path, eg:

    brpc::Channel channel;
    brpc::ChannelOptions opt;
    opt.protocol = brpc::PROTOCOL_HTTP;

    std::string server("list://127.0.0.1:8000,127.0.0.1:8001");
    std::string lb("rr");
    const int ret = channel.Init(server.c_str(), lb.c_str(), &opt);

    brpc::Controller cntl;
    cntl.http_request().uri() = "/dummy";
    channel.CallMethod(nullptr, &cntl, nullptr, nullptr, nullptr);

In the http request, the host field will be set as :
host: 127.0.0.1:8000,127.0.0.1:8001

Similarly, when the ns_url is a file://conf/hosts, the host field in HTTP requeset will be:
host: conf

Expected behavior (期望行为)
host should be set as remote_side IP+Port in the senarios above

Versions (各种版本)
OS: Ubuntu 20.04
Compiler: g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
brpc: latest 59f5d77
protobuf: 3.6.1

Additional context/screenshots (更多上下文/截图)
issue

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions