Skip to content

It is not possible to recreate a listener with the same uri and a different protocol #1810

@IvanEsyagin-iss

Description

@IvanEsyagin-iss

The scenario:

  1. Create and open two listeners on different ports with the http protocol.
  2. Close and delete one of them.
  3. Re-create and open the same listener, but with https protocol.

The result:
An exception is thrown std::invalid_argument with the message : "Error: http_listener can not simultaneously listen both http and https paths of one host". But if initially there were not two listeners but one, then everything would work correctly.

The analysis:
http_linux_server has a map std::map<std::string, std::unique_ptr<hostport_listener>, iequal_to> m_listeners, where new hostport_listener are added with the host+port key in the pplx::task http_server_api::register_listener() function. But there is no deletion from this map in the pplx::task http_linux_server::unregister_listener() function. Therefore, until http_linux_server is deleted(that is, we will not close all open listener) the map will contain an hostport_listener that has already been created. And since the protocol can only be set in the constructor, there is no way to change it.

Here I offered my solution.

I have attached a file with an example example.txt.

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