| // Copyright 2019 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | // This file is reponsible for the masque_server binary. It allows testing | 
 | // our MASQUE server code by creating a MASQUE proxy that relays HTTP/3 | 
 | // requests to web servers tunnelled over MASQUE connections. | 
 | // e.g.: masque_server | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "net/third_party/quiche/src/quic/masque/masque_epoll_server.h" | 
 | #include "net/third_party/quiche/src/quic/masque/masque_server_backend.h" | 
 | #include "net/third_party/quiche/src/quic/platform/api/quic_flags.h" | 
 | #include "net/third_party/quiche/src/quic/platform/api/quic_logging.h" | 
 | #include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h" | 
 |  | 
 | DEFINE_QUIC_COMMAND_LINE_FLAG(int32_t, | 
 |                               port, | 
 |                               9661, | 
 |                               "The port the MASQUE server will listen on."); | 
 |  | 
 | DEFINE_QUIC_COMMAND_LINE_FLAG( | 
 |     std::string, | 
 |     cache_dir, | 
 |     "", | 
 |     "Specifies the directory used during QuicHttpResponseCache " | 
 |     "construction to seed the cache. Cache directory can be " | 
 |     "generated using `wget -p --save-headers <url>`"); | 
 |  | 
 | DEFINE_QUIC_COMMAND_LINE_FLAG( | 
 |     std::string, | 
 |     server_authority, | 
 |     "", | 
 |     "Specifies the authority over which the server will accept MASQUE " | 
 |     "requests. Defaults to empty which allows all authorities."); | 
 |  | 
 | int main(int argc, char* argv[]) { | 
 |   const char* usage = "Usage: masque_server [options]"; | 
 |   std::vector<std::string> non_option_args = | 
 |       quic::QuicParseCommandLineFlags(usage, argc, argv); | 
 |   if (!non_option_args.empty()) { | 
 |     quic::QuicPrintCommandLineFlagHelp(usage); | 
 |     return 0; | 
 |   } | 
 |  | 
 |   auto backend = std::make_unique<quic::MasqueServerBackend>( | 
 |       GetQuicFlag(FLAGS_server_authority), GetQuicFlag(FLAGS_cache_dir)); | 
 |  | 
 |   auto server = std::make_unique<quic::MasqueEpollServer>(backend.get()); | 
 |  | 
 |   if (!server->CreateUDPSocketAndListen(quic::QuicSocketAddress( | 
 |           quic::QuicIpAddress::Any6(), GetQuicFlag(FLAGS_port)))) { | 
 |     return 1; | 
 |   } | 
 |  | 
 |   std::cerr << "Started MASQUE server" << std::endl; | 
 |   server->HandleEventsForever(); | 
 |   return 0; | 
 | } |