| 1512 | |
| 1513 | |
| 1514 | Future<Connection> connect( |
| 1515 | const network::Address& address, |
| 1516 | Scheme scheme, |
| 1517 | const Option<string>& peer_hostname) |
| 1518 | { |
| 1519 | SocketImpl::Kind kind; |
| 1520 | |
| 1521 | switch (scheme) { |
| 1522 | case Scheme::HTTP: |
| 1523 | case Scheme::HTTP_UNIX: |
| 1524 | kind = SocketImpl::Kind::POLL; |
| 1525 | break; |
| 1526 | #ifdef USE_SSL_SOCKET |
| 1527 | case Scheme::HTTPS: |
| 1528 | kind = SocketImpl::Kind::SSL; |
| 1529 | break; |
| 1530 | #endif |
| 1531 | } |
| 1532 | |
| 1533 | Try<network::Socket> socket = network::Socket::create( |
| 1534 | address.family(), |
| 1535 | kind); |
| 1536 | |
| 1537 | if (socket.isError()) { |
| 1538 | return Failure("Failed to create socket: " + socket.error()); |
| 1539 | } |
| 1540 | |
| 1541 | Future<Nothing> connected = [&]() { |
| 1542 | switch (scheme) { |
| 1543 | case Scheme::HTTP: |
| 1544 | case Scheme::HTTP_UNIX: |
| 1545 | return socket->connect(address); |
| 1546 | #ifdef USE_SSL_SOCKET |
| 1547 | case Scheme::HTTPS: |
| 1548 | return socket->connect( |
| 1549 | address, |
| 1550 | network::openssl::create_tls_client_config(peer_hostname)); |
| 1551 | #endif |
| 1552 | } |
| 1553 | UNREACHABLE(); |
| 1554 | }(); |
| 1555 | |
| 1556 | return connected |
| 1557 | .then([socket, address]() -> Future<Connection> { |
| 1558 | Try<network::Address> localAddress = socket->address(); |
| 1559 | if (localAddress.isError()) { |
| 1560 | return Failure("Failed to get socket's local address: " + |
| 1561 | localAddress.error()); |
| 1562 | } |
| 1563 | |
| 1564 | return Connection(socket.get(), localAddress.get(), address); |
| 1565 | }); |
| 1566 | } |
| 1567 | |
| 1568 | |
| 1569 | Future<Connection> connect( |
no test coverage detected