MCPcopy Create free account
hub / github.com/apache/impala / EchoServer

Class EchoServer

security/tls_socket-test.cc:125–212  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

123}
124
125class EchoServer {
126 public:
127 EchoServer()
128 : pthread_sync_(1) {
129 }
130 ~EchoServer() {
131 Stop();
132 Join();
133 }
134
135 void Start() {
136 ASSERT_OK(server_tls_.Init());
137 ASSERT_OK(server_tls_.GenerateSelfSignedCertAndKey());
138 ASSERT_OK(listen_addr_.ParseString("127.0.0.1", 0));
139 ASSERT_OK(listener_.Init(0));
140 ASSERT_OK(listener_.BindAndListen(listen_addr_, /*listen_queue_size=*/10));
141 ASSERT_OK(listener_.GetSocketAddress(&listen_addr_));
142
143 thread_ = thread([&] {
144 pthread_ = pthread_self();
145 pthread_sync_.CountDown();
146 unique_ptr<Socket> sock(new Socket());
147 Sockaddr remote;
148 CHECK_OK(listener_.Accept(sock.get(), &remote, /*flags=*/0));
149
150 TlsHandshake server;
151 CHECK_OK(server_tls_.InitiateHandshake(TlsHandshakeType::SERVER, &server));
152 CHECK_OK(DoNegotiationSide(sock.get(), &server, "server"));
153 CHECK_OK(server.Finish(&sock));
154
155 CHECK_OK(sock->SetRecvTimeout(kTimeout));
156 unique_ptr<uint8_t[]> buf(new uint8_t[kEchoChunkSize]);
157 // An "echo" loop for kEchoChunkSize byte buffers.
158 while (!stop_) {
159 size_t n;
160 Status s = sock->BlockingRecv(buf.get(), kEchoChunkSize, &n, MonoTime::Now() + kTimeout);
161 if (!s.ok()) {
162 CHECK(stop_) << "unexpected error reading: " << s.ToString();
163 }
164
165 LOG(INFO) << "server echoing " << n << " bytes";
166 size_t written;
167 s = sock->BlockingWrite(buf.get(), n, &written, MonoTime::Now() + kTimeout);
168 if (!s.ok()) {
169 CHECK(stop_) << "unexpected error writing: " << s.ToString();
170 }
171 if (slow_read_) {
172 SleepFor(MonoDelta::FromMilliseconds(10));
173 }
174 }
175 });
176 }
177
178 void EnableSlowRead() {
179 slow_read_ = true;
180 }
181
182 const Sockaddr& listen_addr() const {

Callers

nothing calls this directly

Calls 1

WaitMethod · 0.45

Tested by

no test coverage detected