| 1428 | } |
| 1429 | |
| 1430 | void Controller::HandleStreamConnection(Socket *host_socket) { |
| 1431 | if (_request_streams.empty()) { |
| 1432 | CHECK(!has_remote_stream()); |
| 1433 | return; |
| 1434 | } |
| 1435 | size_t stream_num = _request_streams.size(); |
| 1436 | std::vector<SocketUniquePtr> ptrs(stream_num); |
| 1437 | if (!FailedInline()) { |
| 1438 | if (_remote_stream_settings == NULL) { |
| 1439 | if (!FailedInline()) { |
| 1440 | SetFailed(EREQUEST, "The server didn't accept the stream"); |
| 1441 | } |
| 1442 | } else { |
| 1443 | for (size_t i = 0; i < stream_num; ++i) { |
| 1444 | if (Socket::Address(_request_streams[i], &ptrs[i]) != 0) { |
| 1445 | if (!FailedInline()) { |
| 1446 | SetFailed(EREQUEST, "Request stream=%" PRIu64 " was closed before responded", |
| 1447 | _request_streams[i]); |
| 1448 | break; |
| 1449 | } |
| 1450 | } |
| 1451 | } |
| 1452 | } |
| 1453 | } |
| 1454 | if (FailedInline()) { |
| 1455 | Stream::SetFailed(_request_streams, _error_code, |
| 1456 | "%s", _error_text.c_str()); |
| 1457 | if (_remote_stream_settings != NULL) { |
| 1458 | policy::SendStreamRst(host_socket, |
| 1459 | _remote_stream_settings->stream_id()); |
| 1460 | for (int i = 0; i < _remote_stream_settings->extra_stream_ids().size(); ++i) { |
| 1461 | policy::SendStreamRst(host_socket, |
| 1462 | _remote_stream_settings->extra_stream_ids()[i]); |
| 1463 | } |
| 1464 | } |
| 1465 | return; |
| 1466 | } |
| 1467 | Stream* s = (Stream*)ptrs[0]->conn(); |
| 1468 | s->SetConnected(_remote_stream_settings); |
| 1469 | if (stream_num > 1) { |
| 1470 | auto extra_stream_ids = std::move(*_remote_stream_settings->mutable_extra_stream_ids()); |
| 1471 | _remote_stream_settings->clear_extra_stream_ids(); |
| 1472 | for (size_t i = 1; i < stream_num; ++i) { |
| 1473 | if(!ptrs[i]) continue; |
| 1474 | Stream* extra_stream = (Stream *) ptrs[i]->conn(); |
| 1475 | _remote_stream_settings->set_stream_id(extra_stream_ids[i - 1]); |
| 1476 | s->SetHostSocket(host_socket); |
| 1477 | extra_stream->SetConnected(_remote_stream_settings); |
| 1478 | } |
| 1479 | } |
| 1480 | } |
| 1481 | |
| 1482 | // TODO: Need more security advices from professionals. |
| 1483 | // TODO: Is percent encoding better? |
nothing calls this directly
no test coverage detected