SWC-DB  v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
ConnHandler.cc
Go to the documentation of this file.
1 /*
2  * SWC-DB© Copyright since 2019 Alex Kashirin <kashirin.alex@gmail.com>
3  * License details at <https://github.com/kashirin-alex/swc-db/#license>
4  */
5 
6 
8 #include "swcdb/core/Checksum.h"
9 
10 
11 
12 namespace SWC { namespace Comm {
13 
14 
15 
17  auto sock = socket_layer();
18  endpoint_remote = sock->remote_endpoint();
19  endpoint_local = sock->local_endpoint();
21 
22  app_ctx->handle_established(ptr());
23 
24  read();
25 }
26 
27 size_t ConnHandler::pending_read() noexcept {
29  return m_pending.size();
30 }
31 
32 void ConnHandler::do_close_run() noexcept {
33  app_ctx->handle_disconnect(ptr());
34 }
35 
36 bool ConnHandler::send_error(int error, const std::string& msg,
37  const Event::Ptr& ev) noexcept {
38  return send_response(
40  ev,
41  error, msg.c_str(), msg.length() < INT16_MAX? msg.length() : INT16_MAX)
42  );
43 }
44 
45 bool ConnHandler::response_ok(const Event::Ptr& ev) noexcept {
46  auto cbp = Buffers::make(ev, 4);
47  cbp->append_i32(Error::OK);
48  return send_response(cbp);
49 }
50 
52  DispatchHandler::Ptr hdlr) noexcept {
53  if(!connected || cbuf->expired())
54  return false;
55  cbuf->header.flags &= Header::FLAG_REQUEST_MASK;
56  write_or_queue(Outgoing(std::move(cbuf), std::move(hdlr)));
57  return true;
58 }
59 
61  DispatchHandler::Ptr hdlr) {
62  if(!connected)
63  return false;
64  cbuf->header.flags |= Header::FLAG_REQUEST_BIT;
65  write_or_queue(Outgoing(std::move(cbuf), std::move(hdlr)));
66  return true;
67 }
68 
69 void ConnHandler::print(std::ostream& out) const {
70  out << "Connection(encoder=" << Core::Encoder::to_string(get_encoder())
71  << " remote=" << endpoint_remote
72  << " local=" << endpoint_local
73  << ' ' << (is_secure() ? "SECURE" : "PLAIN");
74  if(!is_open())
75  out << " CLOSED";
76  out << ')';
77 }
78 
80  outgoing.cbuf->prepare(get_encoder());
81 
82  if(m_outgoing.activating(std::move(outgoing)))
83  write(outgoing);
84 }
85 
87  Outgoing outgoing;
88  if(!m_outgoing.deactivating(outgoing))
89  write(outgoing);
90 }
91 
92 
93 
98  Sender_noAck(ConnHandlerPtr&& a_conn, const Buffers::Ptr& a_cbuf) noexcept
99  : conn(std::move(a_conn)), cbuf(a_cbuf) {
100  }
102  Sender_noAck(Sender_noAck&& other) noexcept
103  : conn(std::move(other.conn)), cbuf(std::move(other.cbuf)) {
104  }
105  Sender_noAck(const Sender_noAck&) = delete;
108  ~Sender_noAck() noexcept { }
109  void operator()(const asio::error_code& ec, uint32_t bytes) noexcept {
110  try {
111  if(!ec)
112  conn->write_next();
113  if(bytes)
114  conn->app_ctx->net_bytes_sent(conn, bytes);
115  if(!ec)
116  return;
117  } catch(...) { }
118  conn->do_close();
119  }
120 };
121 
122 
128  Sender_Ack(ConnHandlerPtr&& a_conn, const Buffers::Ptr& a_cbuf,
129  DispatchHandler::Ptr&& a_hdlr) noexcept
130  : conn(std::move(a_conn)),
131  cbuf(a_cbuf),
132  hdlr(std::move(a_hdlr)) {
133  }
135  Sender_Ack(Sender_Ack&& other) noexcept
136  : conn(std::move(other.conn)),
137  cbuf(std::move(other.cbuf)),
138  hdlr(std::move(other.hdlr)) {
139  }
140  Sender_Ack(const Sender_Ack&) = delete;
142  Sender_Ack& operator=(const Sender_Ack&) = delete;
143  ~Sender_Ack() noexcept { }
144  void operator()(const asio::error_code& ec, uint32_t bytes) noexcept {
145  try {
146  if(!ec)
147  conn->write_next();
148  auto ev = Event::make(ec ? Error::COMM_SEND_ERROR : Error::OK);
149  ev->header.initialize_from_response(cbuf->header);
150  hdlr->handle(conn, ev);
151  if(bytes)
152  conn->app_ctx->net_bytes_sent(conn, bytes);
153  if(!ec)
154  return;
155  } catch(...) { }
156  conn->do_close();
157  }
158 };
159 
160 
161 
163  auto cbuf = std::move(outgoing.cbuf);
164  auto& header = cbuf->header;
165 
166  if(!outgoing.hdlr || header.flags & Header::FLAG_RESPONSE_IGNORE_BIT) {
167  // send request/response without sent/rsp-ack
168  if(cbuf->expired())
169  return write_next();
170  if(connected)
172  cbuf->get_buffers(),
173  Sender_noAck(ptr(), cbuf)
174  );
175  return;
176  }
177 
178  if(!(header.flags & Header::FLAG_REQUEST_BIT)) {
179  //if(!header.timeout_ms) {
180  // send_response with sent-ack
181  if(cbuf->expired())
182  return write_next();
183 
184  if(connected) {
186  cbuf->get_buffers(),
187  Sender_Ack(ptr(), cbuf, std::move(outgoing.hdlr))
188  );
189  } //else {
190  // send_response expect sent/timeout ack with m_sends
191  return;
192  }
193 
194  // send_request expect rsp/timeout with m_pending
195  auto timer = header.timeout_ms
196  ? new asio::high_resolution_timer(socket_layer()->get_executor())
197  : nullptr;
198 
199  assign_id: {
201  if(header.id) {
202  m_next_req_id = header.id;
203  header.id = 0;
204  } else if(!++m_next_req_id) {
205  ++m_next_req_id;
206  }
207  auto r = m_pending.emplace(m_next_req_id, Pending());
208  if(!r.second)
209  goto assign_id;
210  header.id = m_next_req_id;
211  r.first->second.hdlr = std::move(outgoing.hdlr);
212 
213  if(timer) {
214  r.first->second.timer = timer;
215  timer->expires_after(
216  std::chrono::milliseconds(header.timeout_ms));
217  struct TimerTask {
218  ConnHandlerPtr conn;
219  Buffers::Ptr cbuf;
220  TimerTask(ConnHandlerPtr&& a_conn, const Buffers::Ptr& a_cbuf)
221  noexcept : conn(std::move(a_conn)), cbuf(a_cbuf) { }
223  TimerTask(TimerTask&& other) noexcept
224  : conn(std::move(other.conn)),
225  cbuf(std::move(other.cbuf)) {
226  }
227  TimerTask(const TimerTask&) = delete;
228  TimerTask& operator=(TimerTask&&) = delete;
229  TimerTask& operator=(const TimerTask&) = delete;
230  ~TimerTask() noexcept { }
231  void operator()(const asio::error_code& ec) {
232  if(ec == asio::error::operation_aborted)
233  return;
235  ev->header.initialize_from_request(cbuf->header);
236  ev->header.flags &= Header::FLAG_REQUEST_MASK;
237  conn->run_pending(std::move(ev));
238  }
239  };
240  timer->async_wait(TimerTask(ptr(), cbuf));
241  }
242  }
243 
244  if(!connected)
245  return do_close();
246 
248  cbuf->get_buffers(),
249  Sender_noAck(ptr(), cbuf)
250  );
251 }
252 
253 
254 
259  : conn(std::move(a_conn)) { }
262  : conn(std::move(other.conn)) { }
266  ~Receiver_HeaderPrefix() noexcept { }
267  void operator()(const asio::error_code& ec, size_t filled) noexcept;
268 };
269 
274  Receiver_Header(const ConnHandlerPtr& a_conn, Event::Ptr&& a_ev) noexcept
275  : conn(a_conn), ev(std::move(a_ev)) { }
278  : conn(std::move(other.conn)), ev(std::move(other.ev)) { }
282  ~Receiver_Header() noexcept { }
283  void operator()(asio::error_code ec, size_t filled) noexcept;
284 };
285 
290  Receiver_Buffer(ConnHandlerPtr&& a_conn, Event::Ptr&& a_ev) noexcept
291  : conn(std::move(a_conn)), ev(std::move(a_ev)) { }
294  : conn(std::move(other.conn)), ev(std::move(other.ev)) { }
298  ~Receiver_Buffer() noexcept { }
299  void operator()(asio::error_code ec, size_t filled) noexcept;
300 };
301 
302 
304  const asio::error_code& ec, size_t filled) noexcept {
305  try {
306  conn->m_recv_bytes += filled;
307  if(ec || filled != Header::PREFIX_LENGTH)
308  goto _quit;
309 
310  auto ev = Event::make(Error::OK);
311  try {
312  const uint8_t* buf = conn->_buf_header;
313  ev->header.decode_prefix(&buf, &filled);
314  } catch(...) {
315  ev->header.header_len = 0;
316  }
317 
318  if(!ev->header.header_len) {
320  "read, REQUEST HEADER_PREFIX_TRUNCATED: remain=" SWC_FMT_LU,
321  filled);
322  goto _quit;
323  }
324  filled = ev->header.header_len - Header::PREFIX_LENGTH;
325  conn->do_async_read(
326  conn->_buf_header + Header::PREFIX_LENGTH,
327  filled,
328  Receiver_Header(conn, std::move(ev))
329  );
330  return;
331  } catch(...) {
332  }
333  _quit:
334  conn->do_close_recv();
335 }
336 
338  asio::error_code ec, size_t filled) noexcept {
339  try {
340  conn->m_recv_bytes += filled;
341  if(!ec) {
342  if(filled + Header::PREFIX_LENGTH != ev->header.header_len) {
343  ec = asio::error::eof;
344  } else {
345  filled = ev->header.header_len;
346  try {
347  const uint8_t* buf = conn->_buf_header;
348  ev->header.decode(&buf, &filled);
349  } catch(...) {
350  ec = asio::error::eof;
351  }
352  }
353  }
354  if(ec) {
355  SWC_LOGF(LOG_WARN, "read, REQUEST HEADER_TRUNCATED: len=%d",
356  ev->header.header_len);
357  goto _quit;
358  } else if(ev->header.buffers) {
359  conn->recv_buffers(std::move(ev));
360  } else {
361  conn->received(std::move(ev));
362  }
363  return;
364  } catch(...) {
365  }
366  _quit:
367  conn->do_close_recv();
368 }
369 
371  size_t filled) noexcept {
372  try {
373  conn->m_recv_bytes += filled;
374  if(!ec) {
375  StaticBuffer* buffer;
376  uint32_t checksum;
377  if(!ev->data_ext.size) {
378  buffer = &ev->data;
379  checksum = ev->header.data.chksum;
380  } else {
381  buffer = &ev->data_ext;
382  checksum = ev->header.data_ext.chksum;
383  }
384  if(filled != buffer->size ||
385  !Core::checksum_i32_chk(checksum, buffer->base, buffer->size)) {
386  ec = asio::error::eof;
387  }
388  }
389  if(ec) {
391  SWC_LOG_OSTREAM << "read, REQUEST PAYLOAD_TRUNCATED: nbuff("
392  << (bool(ev->data.size) + bool(ev->data_ext.size)) << ") ";
393  ev->print(SWC_LOG_OSTREAM);
394  );
395  goto _quit;
396  } else if(ev->header.buffers == bool(ev->data.size) +
397  bool(ev->data_ext.size)) {
398  conn->received(std::move(ev));
399  } else {
400  conn->recv_buffers(std::move(ev));
401  }
402  return;
403  } catch(...) {
404  }
405  _quit:
406  conn->do_close_recv();
407 }
408 
409 
410 
411 void ConnHandler::read() noexcept {
412  if(connected) {
413  m_recv_bytes = 0;
417  );
418  }
419 }
420 
422  StaticBuffer* buffer;
423  size_t remain;
424  if(!ev->data.size) {
425  buffer = &ev->data;
426  remain = ev->header.data.size;
427  } else {
428  buffer = &ev->data_ext;
429  remain = ev->header.data_ext.size;
430  }
431  buffer->reallocate(remain);
433  buffer->base, remain,
434  Receiver_Buffer(ptr(), std::move(ev))
435  );
436 }
437 
438 void ConnHandler::received(Event::Ptr&& ev) noexcept {
439  if(ev->header.flags & Header::FLAG_REQUEST_BIT)
440  ev->received();
441 
442  try {
443  run_pending(std::move(ev));
444  } catch(...) {
445  try {
448  print(SWC_LOG_OSTREAM << ' ');
449  if(ev) ev->print(SWC_LOG_OSTREAM << ' ');
450  SWC_LOG_OSTREAM << ' ' << e;
451  );
452  } catch(...) { }
453  }
454 
455  app_ctx->net_bytes_received(ptr(), m_recv_bytes);
456  read();
457 }
458 
459 void ConnHandler::disconnected() noexcept {
460  try {
461  for(Outgoing outgoing; !m_outgoing.deactivating(outgoing); ) {
462  if(outgoing.hdlr)
463  outgoing.hdlr->handle_no_conn();
464  }
465  for(Pending pending; ;) {
466  {
468  if(m_pending.empty())
469  return;
470  pending = std::move(m_pending.begin()->second);
471  m_pending.erase(m_pending.cbegin());
472  }
473  if(pending.timer)
474  pending.timer->cancel();
475  pending.hdlr->handle_no_conn();
476  }
477 
478  } catch(...) {
479  try {
482  print(SWC_LOG_OSTREAM << ' ');
483  SWC_LOG_OSTREAM << ' ' << e;
484  );
485  } catch(...) { }
486  }
487 }
488 
490  Pending pending;
491  if(ev->header.id && !(ev->header.flags & Header::FLAG_REQUEST_BIT)) {
492  bool partial = ev->header.flags & Header::FLAG_RESPONSE_PARTIAL_BIT;
493  {
495  auto it = m_pending.find(ev->header.id);
496  if(it != m_pending.cend()) {
497  if(partial) {
498  pending.hdlr = it->second.hdlr;
499  } else {
500  pending = std::move(it->second);
501  m_pending.erase(it);
502  }
503  }
504  }
505  if(pending.timer)
506  pending.timer->cancel();
507  }
508 
509  if(pending.hdlr) {
510  struct Task {
511  ConnHandlerPtr conn;
513  Event::Ptr ev;
514  Task(ConnHandlerPtr&& a_conn, DispatchHandler::Ptr&& a_hdlr,
515  Event::Ptr&& a_ev) noexcept
516  : conn(std::move(a_conn)),
517  hdlr(std::move(a_hdlr)),
518  ev(std::move(a_ev)) {
519  }
521  Task(Task&& other) noexcept
522  : conn(std::move(other.conn)),
523  hdlr(std::move(other.hdlr)),
524  ev(std::move(other.ev)) {
525  }
526  Task(const Task&) = delete;
527  Task& operator=(Task&&) = delete;
528  Task& operator=(const Task&) = delete;
529  ~Task() noexcept { }
530  void operator()() {
531  if(!ev->error && ev->header.buffers)
532  ev->decode_buffers();
533  hdlr->handle(conn, ev);
534  }
535  };
536  asio::post(
537  socket_layer()->get_executor(),
538  Task(ptr(), std::move(pending.hdlr), std::move(ev))
539  );
540 
541  } else {
542  struct Task {
543  ConnHandlerPtr conn;
544  Event::Ptr ev;
545  Task(ConnHandlerPtr&& a_conn, Event::Ptr&& a_ev) noexcept
546  : conn(std::move(a_conn)), ev(std::move(a_ev)) { }
548  Task(Task&& other) noexcept
549  : conn(std::move(other.conn)), ev(std::move(other.ev)) { }
550  Task(const Task&) = delete;
551  Task& operator=(Task&&) = delete;
552  Task& operator=(const Task&) = delete;
553  ~Task() noexcept { }
554  void operator()() {
555  if(!ev->error && ev->header.buffers)
556  ev->decode_buffers();
557  conn->app_ctx->handle(conn, ev);
558  }
559  };
560  asio::post(socket_layer()->get_executor(), Task(ptr(), std::move(ev)));
561  }
562 }
563 
564 
565 
566 
567 
570  return ConnHandlerPlain::Ptr(new ConnHandlerPlain(app_ctx, socket));
571 }
572 
574  SocketPlain& socket) noexcept
575  : ConnHandler(a_app_ctx),
576  m_sock(std::move(socket)) {
577  m_sock.lowest_layer().set_option(asio::ip::tcp::no_delay(true));
578 }
579 
581  if(is_open()) {
582  asio::error_code ec;
583  m_sock.close(ec);
584  }
585 }
586 
587 void ConnHandlerPlain::do_close() noexcept {
588  bool at = true;
589  if(connected.compare_exchange_weak(at, false)) {
590  if(m_sock.is_open()) {
591  asio::error_code ec;
592  m_sock.cancel(ec);
593  m_sock.close(ec);
594  }
595  do_close_run();
596  }
597  disconnected();
598 }
599 
600 bool ConnHandlerPlain::is_open() const noexcept {
601  return connected && m_sock.is_open();
602 }
603 
605  return &m_sock.lowest_layer();
606 }
607 
608 #pragma GCC diagnostic push
609 #pragma GCC diagnostic ignored "-Wnull-dereference"
610 #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
611 
615  noexcept {
616  asio::async_write(m_sock, std::move(buffers), std::move(hdlr));
617 }
618 
622  noexcept {
623  asio::async_write(m_sock, std::move(buffers), std::move(hdlr));
624 }
625 
627  uint8_t* data, uint32_t sz,
628  ConnHandler::Receiver_HeaderPrefix&& hdlr) noexcept {
629  asio::async_read(m_sock, asio::mutable_buffer(data, sz), std::move(hdlr));
630 }
631 
633  uint8_t* data, uint32_t sz,
634  ConnHandler::Receiver_Header&& hdlr) noexcept {
635  asio::async_read(m_sock, asio::mutable_buffer(data, sz), std::move(hdlr));
636 }
637 
639  uint8_t* data, uint32_t sz,
640  ConnHandler::Receiver_Buffer&& hdlr) noexcept {
641  asio::async_read(m_sock, asio::mutable_buffer(data, sz), std::move(hdlr));
642 }
643 
644 
645 void ConnHandlerPlain::read(uint8_t** bufp, size_t* remainp,
646  asio::error_code& ec) { // unused
647  size_t read = 0;
648  do {
649  read = m_sock.read_some(
650  asio::mutable_buffer((*bufp)+=read, *remainp), ec);
651  } while(!ec && (*remainp -= read));
652 }
653 
654 #pragma GCC diagnostic pop
655 
656 
657 
658 
660 ConnHandlerSSL::make(AppContext::Ptr& app_ctx, asio::ssl::context& ssl_ctx,
661  SocketPlain& socket) {
662  return ConnHandlerSSL::Ptr(new ConnHandlerSSL(app_ctx, ssl_ctx, socket));
663 }
664 
666  asio::ssl::context& ssl_ctx,
667  SocketPlain& socket) noexcept
668  : ConnHandler(a_app_ctx),
669  m_sock(std::move(socket), ssl_ctx),
670  m_strand(m_sock.get_executor()) {
671  m_sock.lowest_layer().set_option(asio::ip::tcp::no_delay(true));
672 }
673 
675  if(is_open()) {
676  asio::error_code ec;
677  m_sock.lowest_layer().close(ec);
678  }
679 }
680 
681 void ConnHandlerSSL::do_close() noexcept {
682  bool at = true;
683  if(connected.compare_exchange_weak(at, false)) {
684  if(m_sock.lowest_layer().is_open()) {
685  asio::error_code ec;
686  m_sock.lowest_layer().cancel(ec);
687  //m_sock.shutdown(ec);
688  m_sock.lowest_layer().close(ec);
689  }
690  do_close_run();
691  }
692  disconnected();
693 
694  /* ssl-segment (if protocol is shutdown)
695  if(m_sock.lowest_layer().is_open()) {
696  m_sock.async_shutdown([this, ptr=ptr()](asio::error_code ec) {
697  if(m_sock.lowest_layer().is_open()) {
698  m_sock.lowest_layer().cancel(ec);
699  m_sock.lowest_layer().close(ec);
700  }
701  do_close_run();
702  });
703  } else {
704  do_close_run();
705  } */
706 }
707 
708 bool ConnHandlerSSL::is_open() const noexcept {
709  return connected && m_sock.lowest_layer().is_open();
710 }
711 
713  SocketSSL::handshake_type typ,
714  asio::error_code& ec)
715  noexcept {
716  /*
717  m_sock.lowest_layer().non_blocking(true, ec);
718  if(!ec)
719  */
720  m_sock.handshake(typ, ec);
721 }
722 
724  return &m_sock.lowest_layer();
725 }
726 
727 #pragma GCC diagnostic push
728 #pragma GCC diagnostic ignored "-Wnull-dereference"
729 #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
730 
734  noexcept {
735  asio::async_write(
736  m_sock, std::move(buffers),
737  asio::bind_executor(m_strand, std::move(hdlr))
738  );
739 }
740 
744  noexcept {
745  asio::async_write(
746  m_sock, std::move(buffers),
747  asio::bind_executor(m_strand, std::move(hdlr))
748  );
749 }
750 
752  uint8_t* data, uint32_t sz,
753  ConnHandler::Receiver_HeaderPrefix&& hdlr) noexcept {
754  asio::async_read(
755  m_sock, asio::mutable_buffer(data, sz),
756  asio::bind_executor(m_strand, std::move(hdlr))
757  );
758 }
759 
761  uint8_t* data, uint32_t sz,
762  ConnHandler::Receiver_Header&& hdlr) noexcept {
763  asio::async_read(
764  m_sock, asio::mutable_buffer(data, sz),
765  asio::bind_executor(m_strand, std::move(hdlr))
766  );
767 }
768 
770  uint8_t* data, uint32_t sz,
771  ConnHandler::Receiver_Buffer&& hdlr) noexcept {
772  asio::async_read(
773  m_sock, asio::mutable_buffer(data, sz),
774  asio::bind_executor(m_strand, std::move(hdlr))
775  );
776 }
777 
778 
779 void ConnHandlerSSL::read(uint8_t** bufp, size_t* remainp,
780  asio::error_code& ec) { // unused
781  size_t read = 0;
782  do {
783  read = m_sock.read_some(
784  asio::mutable_buffer((*bufp)+=read, *remainp), ec);
785  } while(!ec && (*remainp -= read));
786 }
787 
788 #pragma GCC diagnostic pop
789 
790 
791 }}
SWC::Comm::ConnHandler::Receiver_Buffer::Receiver_Buffer
Receiver_Buffer(const Receiver_Buffer &)=delete
SWC::Core::AtomicBase::compare_exchange_weak
constexpr SWC_CAN_INLINE bool compare_exchange_weak(T &at, T value) noexcept
Definition: Atomic.h:52
SWC::Comm::ConnHandler::do_async_read
virtual void do_async_read(uint8_t *data, uint32_t sz, Receiver_HeaderPrefix &&hdlr) noexcept=0
SWC::Comm::ConnHandler::Outgoing::hdlr
DispatchHandler::Ptr hdlr
Definition: ConnHandler.h:34
SWC::Comm::ConnHandler::Receiver_HeaderPrefix::operator=
Receiver_HeaderPrefix & operator=(const Receiver_HeaderPrefix &)=delete
SWC::Comm::ConnHandler::Pending
Definition: ConnHandler.h:64
SWC::Comm::ConnHandler::socket_layer
virtual SocketLayer * socket_layer() noexcept=0
SWC::Comm::Header::FLAG_REQUEST_BIT
static const uint8_t FLAG_REQUEST_BIT
Definition: Header.h:25
SWC_LOG_OSTREAM
#define SWC_LOG_OSTREAM
Definition: Logger.h:44
SWC::Comm::ConnHandler::Receiver_Buffer::operator=
Receiver_Buffer & operator=(Receiver_Buffer &&)=delete
SWC::Comm::ConnHandler::Sender_noAck
Definition: ConnHandler.cc:94
SWC::Error::REQUEST_TIMEOUT
@ REQUEST_TIMEOUT
Definition: Error.h:73
SWC::Core::Buffer::reallocate
SWC_CAN_INLINE void reallocate(size_t len)
Definition: Buffer.h:92
SWC::Comm::ConnHandler::send_response
bool send_response(Buffers::Ptr cbuf, DispatchHandler::Ptr hdlr=nullptr) noexcept
Definition: ConnHandler.cc:51
SWC::Comm::ConnHandler::Receiver_Header::~Receiver_Header
~Receiver_Header() noexcept
Definition: ConnHandler.cc:282
checksum
uint32_t checksum
Header checksum (excl. it self)
Definition: Header.h:59
SWC::Comm::ConnHandlerPlain::m_sock
SocketPlain m_sock
Definition: ConnHandler.h:290
SWC_LOGF
#define SWC_LOGF(priority, fmt,...)
Definition: Logger.h:188
SWC::Comm::Buffers::Ptr
std::shared_ptr< Buffers > Ptr
Definition: Buffers.h:23
SWC_LOG_OUT
#define SWC_LOG_OUT(pr, _code_)
Definition: Logger.h:178
data
T data
Definition: BitFieldInt.h:1
SWC::Comm::ConnHandler::Receiver_Header
Definition: ConnHandler.cc:270
SWC::Comm::ConnHandlerSSL::Ptr
std::shared_ptr< ConnHandlerSSL > Ptr
Definition: ConnHandler.h:299
SWC::Comm::ConnHandlerSSL::ConnHandlerSSL
ConnHandlerSSL(AppContext::Ptr &app_ctx, asio::ssl::context &ssl_ctx, SocketPlain &socket) noexcept
Definition: ConnHandler.cc:665
SWC::Comm::ConnHandler::is_open
virtual bool is_open() const noexcept=0
SWC::Comm::ConnHandler::Receiver_HeaderPrefix::Receiver_HeaderPrefix
SWC_CAN_INLINE Receiver_HeaderPrefix(ConnHandlerPtr &&a_conn) noexcept
Definition: ConnHandler.cc:258
SWC::Comm::ConnHandler::Outgoing
Definition: ConnHandler.h:32
ConnHandler.h
SWC::Comm::ConnHandler::app_ctx
const AppContext::Ptr app_ctx
Definition: ConnHandler.h:110
SWC::Comm::ConnHandler::read
void read() noexcept
Definition: ConnHandler.cc:411
SWC::Comm::ConnHandler::Receiver_Buffer::~Receiver_Buffer
~Receiver_Buffer() noexcept
Definition: ConnHandler.cc:298
SWC::Comm::ConnHandlerSSL::handshake
void handshake(SocketSSL::handshake_type typ, T &&hdlr) noexcept
Definition: ConnHandler.h:318
SWC::Comm::ConnHandler::Pending::timer
asio::high_resolution_timer * timer
Definition: ConnHandler.h:66
SWC::Comm::ConnHandler::received
void received(Event::Ptr &&ev) noexcept
Definition: ConnHandler.cc:438
SWC::Comm::Buffers::create_error_message
static Ptr create_error_message(const Event::Ptr &ev, int error, const char *msg, uint16_t len)
Definition: Buffers.h:180
SWC::Core::checksum_i32_chk
SWC_CAN_INLINE bool checksum_i32_chk(uint32_t checksum, const uint8_t *base, uint32_t len)
Definition: Checksum.h:94
SWC::Core::MutexSptd::scope
Definition: MutexSptd.h:96
SWC::Comm::ConnHandler::endpoint_remote
EndPoint endpoint_remote
Definition: ConnHandler.h:111
SWC::Comm::SocketPlain
asio::ip::tcp::socket SocketPlain
Definition: ConnHandler.h:25
SWC::Comm::Protocol::Rgr::Handler::assign_id
void assign_id(const ConnHandlerPtr &conn, const Event::Ptr &ev, Mngr::Req::RgrMngId::Ptr id_mngr)
Definition: AssignId.h:15
SWC::Comm::ConnHandler::Sender_noAck::Sender_noAck
SWC_CAN_INLINE Sender_noAck(Sender_noAck &&other) noexcept
Definition: ConnHandler.cc:102
SWC::Comm::SocketLayer
asio::ip::tcp::socket::lowest_layer_type SocketLayer
Definition: ConnHandler.h:24
SWC::Comm::ConnHandler::Receiver_HeaderPrefix::operator()
void operator()(const asio::error_code &ec, size_t filled) noexcept
Definition: ConnHandler.cc:303
SWC::Common::Files::RgrData::read
static void read(DB::RgrData &data, int &err, const std::string &filepath)
Definition: RgrData.h:27
SWC::Comm::ConnHandlerPlain::do_async_read
void do_async_read(uint8_t *data, uint32_t sz, Receiver_HeaderPrefix &&hdlr) noexcept override
Definition: ConnHandler.cc:626
SWC::Comm::ConnHandler::Receiver_Buffer::Receiver_Buffer
SWC_CAN_INLINE Receiver_Buffer(ConnHandlerPtr &&a_conn, Event::Ptr &&a_ev) noexcept
Definition: ConnHandler.cc:290
SWC::Comm::ConnHandler::write_or_queue
void write_or_queue(Outgoing &&outgoing)
Definition: ConnHandler.cc:79
SWC::Error::COMM_SEND_ERROR
@ COMM_SEND_ERROR
Definition: Error.h:66
SWC::Comm::ConnHandler::Receiver_Header::conn
ConnHandlerPtr conn
Definition: ConnHandler.cc:271
SWC::Comm::Header::FLAG_RESPONSE_PARTIAL_BIT
static const uint8_t FLAG_RESPONSE_PARTIAL_BIT
Definition: Header.h:29
SWC::Comm::ConnHandler::Receiver_Header::operator=
Receiver_Header & operator=(const Receiver_Header &)=delete
SWC::Comm::print
void print(std::ostream &out, const EndPoints &endpoints)
Definition: Resolver.cc:85
SWC::Comm::ConnHandler::m_recv_bytes
size_t m_recv_bytes
Definition: ConnHandler.h:245
SWC::Comm::ConnHandlerPlain::~ConnHandlerPlain
virtual ~ConnHandlerPlain() noexcept
Definition: ConnHandler.cc:580
SWC::Comm::ConnHandler::do_close
virtual void do_close() noexcept=0
SWC::Comm::ConnHandler::m_next_req_id
uint32_t m_next_req_id
Definition: ConnHandler.h:240
SWC::Comm::ConnHandlerPlain::ConnHandlerPlain
ConnHandlerPlain(AppContext::Ptr &app_ctx, SocketPlain &socket) noexcept
Definition: ConnHandler.cc:573
SWC::Comm::ConnHandler::print
void print(std::ostream &out) const
Definition: ConnHandler.cc:69
SWC::Comm::AppContext::Ptr
std::shared_ptr< AppContext > Ptr
Definition: AppContext.h:23
SWC::Comm::ConnHandler::Receiver_Header::operator=
Receiver_Header & operator=(Receiver_Header &&)=delete
SWC::Comm::ConnHandlerSSL::make
static Ptr make(AppContext::Ptr &app_ctx, asio::ssl::context &ssl_ctx, SocketPlain &socket)
Definition: ConnHandler.cc:660
SWC::Comm::ConnHandler::new_connection
void new_connection()
Definition: ConnHandler.cc:16
SWC::Comm::ConnHandler::write_next
void write_next()
Definition: ConnHandler.cc:86
SWC::Comm::ConnHandlerSSL::~ConnHandlerSSL
virtual ~ConnHandlerSSL() noexcept
Definition: ConnHandler.cc:674
SWC::Error::OK
@ OK
Definition: Error.h:45
SWC::Comm::ConnHandler::recv_buffers
void recv_buffers(Event::Ptr &&ev)
Definition: ConnHandler.cc:421
SWC::Comm::ConnHandler::operator=
ConnHandler & operator=(const ConnHandler &)=delete
SWC_CAN_INLINE
#define SWC_CAN_INLINE
Definition: Compat.h:102
SWC::Comm::ConnHandler::Sender_Ack::operator=
Sender_Ack & operator=(Sender_Ack &&)=delete
SWC::LOG_DEBUG
@ LOG_DEBUG
Definition: Logger.h:36
SWC::Comm::ConnHandler::Sender_Ack::hdlr
DispatchHandler::Ptr hdlr
Definition: ConnHandler.cc:126
SWC::Comm::ConnHandlerPlain::is_open
bool is_open() const noexcept override
Definition: ConnHandler.cc:600
SWC::Comm::ConnHandler::run_pending
void run_pending(Event::Ptr &&ev)
Definition: ConnHandler.cc:489
SWC::Comm::ConnHandler::_buf_header
uint8_t _buf_header[Header::MAX_LENGTH]
Definition: ConnHandler.h:246
SWC::Comm::ConnHandler::Receiver_Buffer::Receiver_Buffer
SWC_CAN_INLINE Receiver_Buffer(Receiver_Buffer &&other) noexcept
Definition: ConnHandler.cc:293
SWC::Comm::ConnHandler::Sender_Ack::operator=
Sender_Ack & operator=(const Sender_Ack &)=delete
SWC_CURRENT_EXCEPTION
#define SWC_CURRENT_EXCEPTION(_msg_)
Definition: Exception.h:119
SWC::Comm::ConnHandler::Sender_Ack::cbuf
Buffers::Ptr cbuf
Definition: ConnHandler.cc:125
SWC::Core::Buffer::base
value_type * base
Definition: Buffer.h:131
SWC::Comm::ConnHandler::send_error
bool send_error(int error, const std::string &msg, const Event::Ptr &ev) noexcept
Definition: ConnHandler.cc:36
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
SWC::Comm::ConnHandlerSSL::m_sock
SocketSSL m_sock
Definition: ConnHandler.h:357
SWC::Comm::ConnHandler::Sender_noAck::~Sender_noAck
~Sender_noAck() noexcept
Definition: ConnHandler.cc:108
SWC::Comm::ConnHandler::Sender_noAck::Sender_noAck
Sender_noAck(const Sender_noAck &)=delete
SWC::Comm::ConnHandler::response_ok
bool response_ok(const Event::Ptr &ev) noexcept
Definition: ConnHandler.cc:45
SWC::Comm::ConnHandler::Receiver_Buffer::ev
Event::Ptr ev
Definition: ConnHandler.cc:288
SWC::Comm::ConnHandler::Sender_Ack::Sender_Ack
SWC_CAN_INLINE Sender_Ack(Sender_Ack &&other) noexcept
Definition: ConnHandler.cc:135
SWC::Comm::ConnHandler::do_async_write
virtual void do_async_write(Core::Vector< asio::const_buffer > &&buffers, Sender_noAck &&hdlr) noexcept=0
SWC::Core::Buffer
Definition: Buffer.h:18
SWC::Comm::ConnHandler::Receiver_HeaderPrefix::Receiver_HeaderPrefix
SWC_CAN_INLINE Receiver_HeaderPrefix(Receiver_HeaderPrefix &&other) noexcept
Definition: ConnHandler.cc:261
SWC::Core::Buffer::size
size_t size
Definition: Buffer.h:130
SWC::Comm::ConnHandlerSSL::is_open
bool is_open() const noexcept override
Definition: ConnHandler.cc:708
SWC::Comm::ConnHandler::Sender_Ack
Definition: ConnHandler.cc:123
SWC::Comm::ConnHandler
Definition: ConnHandler.h:29
SWC::Comm::ConnHandler::Receiver_Buffer::operator=
Receiver_Buffer & operator=(const Receiver_Buffer &)=delete
SWC::Comm::ConnHandler::get_encoder
SWC_CAN_INLINE Core::Encoder::Type get_encoder() const noexcept
Definition: ConnHandler.h:125
SWC::Comm::ConnHandler::endpoint_local
EndPoint endpoint_local
Definition: ConnHandler.h:112
SWC::Comm::ConnHandler::connected
Core::AtomicBool connected
Definition: ConnHandler.h:109
SWC::Comm::ConnHandler::Sender_Ack::Sender_Ack
SWC_CAN_INLINE Sender_Ack(ConnHandlerPtr &&a_conn, const Buffers::Ptr &a_cbuf, DispatchHandler::Ptr &&a_hdlr) noexcept
Definition: ConnHandler.cc:128
SWC::Comm::ConnHandler::Sender_noAck::conn
ConnHandlerPtr conn
Definition: ConnHandler.cc:95
SWC::Comm::ConnHandlerPlain::socket_layer
SocketLayer *SWC_CONST_FUNC socket_layer() noexcept override
Definition: ConnHandler.cc:604
SWC::Comm::ConnHandler::Receiver_Header::Receiver_Header
SWC_CAN_INLINE Receiver_Header(Receiver_Header &&other) noexcept
Definition: ConnHandler.cc:277
SWC::Comm::ConnHandler::ptr
SWC_CAN_INLINE ConnHandlerPtr ptr() noexcept
Definition: ConnHandler.h:170
SWC::Comm::ConnHandler::Sender_Ack::conn
ConnHandlerPtr conn
Definition: ConnHandler.cc:124
SWC::LOG_ERROR
@ LOG_ERROR
Definition: Logger.h:32
SWC::Comm::ConnHandler::Receiver_Header::Receiver_Header
SWC_CAN_INLINE Receiver_Header(const ConnHandlerPtr &a_conn, Event::Ptr &&a_ev) noexcept
Definition: ConnHandler.cc:274
buffers
uint8_t buffers
number of buffers from 0 to 2 (data+data_ext)
Definition: Header.h:56
SWC_FMT_LU
#define SWC_FMT_LU
Definition: Compat.h:98
SWC::Comm::ConnHandlerPlain::Ptr
std::shared_ptr< ConnHandlerPlain > Ptr
Definition: ConnHandler.h:256
SWC::Comm::ConnHandler::Sender_noAck::operator=
Sender_noAck & operator=(const Sender_noAck &)=delete
SWC::Comm::ConnHandlerSSL::do_async_write
void do_async_write(Core::Vector< asio::const_buffer > &&buffers, Sender_noAck &&hdlr) noexcept override
Definition: ConnHandler.cc:731
SWC::Comm::ConnHandler::Sender_noAck::Sender_noAck
SWC_CAN_INLINE Sender_noAck(ConnHandlerPtr &&a_conn, const Buffers::Ptr &a_cbuf) noexcept
Definition: ConnHandler.cc:98
SWC::Comm::ConnHandlerSSL::do_async_read
void do_async_read(uint8_t *data, uint32_t sz, Receiver_HeaderPrefix &&hdlr) noexcept override
Definition: ConnHandler.cc:751
SWC::Comm::ConnHandlerPtr
std::shared_ptr< ConnHandler > ConnHandlerPtr
Definition: AppContext.h:17
SWC::Comm::ConnHandler::write
void write(Outgoing &outgoing)
Definition: ConnHandler.cc:162
Checksum.h
SWC::Comm::Header::PREFIX_LENGTH
static const uint8_t PREFIX_LENGTH
Definition: Header.h:21
SWC::Core::Vector
Definition: Vector.h:14
SWC::Comm::Header::FLAG_RESPONSE_IGNORE_BIT
static const uint8_t FLAG_RESPONSE_IGNORE_BIT
Definition: Header.h:28
SWC::Comm::ConnHandlerPlain::do_async_write
void do_async_write(Core::Vector< asio::const_buffer > &&buffers, Sender_noAck &&hdlr) noexcept override
Definition: ConnHandler.cc:612
SWC::Comm::ConnHandler::m_pending
std::unordered_map< uint32_t, Pending, PendingHash > m_pending
Definition: ConnHandler.h:244
SWC::Comm::ConnHandler::Receiver_Header::Receiver_Header
Receiver_Header(const Receiver_Header &)=delete
SWC::Comm::Buffers::make
static SWC_CAN_INLINE Ptr make(uint32_t reserve=0)
Definition: Buffers.h:27
SWC::Comm::ConnHandler::Pending::hdlr
DispatchHandler::Ptr hdlr
Definition: ConnHandler.h:65
SWC::Comm::ConnHandler::Receiver_HeaderPrefix::Receiver_HeaderPrefix
Receiver_HeaderPrefix(const Receiver_HeaderPrefix &)=delete
SWC::Comm::ConnHandler::Receiver_Buffer::conn
ConnHandlerPtr conn
Definition: ConnHandler.cc:287
SWC::Comm::Header::FLAG_REQUEST_MASK
static const uint8_t FLAG_REQUEST_MASK
Definition: Header.h:26
SWC::Comm::ConnHandler::send_request
bool send_request(Buffers::Ptr cbuf, DispatchHandler::Ptr hdlr)
Definition: ConnHandler.cc:60
SWC::Comm::ConnHandler::Sender_noAck::operator()
void operator()(const asio::error_code &ec, uint32_t bytes) noexcept
Definition: ConnHandler.cc:109
SWC::Comm::Event::make
static SWC_CAN_INLINE Ptr make(int error)
Definition: Event.h:36
SWC::Core::Encoder::to_string
const char *SWC_CONST_FUNC to_string(Type typ) noexcept
Definition: Encoder.cc:31
SWC::Comm::ConnHandler::pending_read
size_t pending_read() noexcept
Definition: ConnHandler.cc:27
SWC::Comm::ConnHandlerPlain::do_close
void do_close() noexcept override
Definition: ConnHandler.cc:587
SWC::Comm::ConnHandler::Sender_noAck::operator=
Sender_noAck & operator=(Sender_noAck &&)=delete
SWC::Comm::ConnHandler::Receiver_HeaderPrefix
Definition: ConnHandler.cc:255
SWC::LOG_WARN
@ LOG_WARN
Definition: Logger.h:33
SWC::Comm::ConnHandlerSSL::do_close
void do_close() noexcept override
Definition: ConnHandler.cc:681
SWC::Comm::ConnHandler::Receiver_HeaderPrefix::operator=
Receiver_HeaderPrefix & operator=(Receiver_HeaderPrefix &&)=delete
SWC::Comm::Event::Ptr
std::shared_ptr< Event > Ptr
Definition: Event.h:33
SWC::Comm::ConnHandler::disconnected
void disconnected() noexcept
Definition: ConnHandler.cc:459
SWC::Comm::ConnHandler::Receiver_HeaderPrefix::conn
ConnHandlerPtr conn
Definition: ConnHandler.cc:256
SWC::Comm::ConnHandler::Receiver_Header::ev
Event::Ptr ev
Definition: ConnHandler.cc:272
SWC::Comm::ConnHandler::Sender_Ack::operator()
void operator()(const asio::error_code &ec, uint32_t bytes) noexcept
Definition: ConnHandler.cc:144
SWC::Comm::DispatchHandler::Ptr
std::shared_ptr< DispatchHandler > Ptr
Definition: DispatchHandler.h:20
SWC::Comm::ConnHandler::Receiver_Header::operator()
void operator()(asio::error_code ec, size_t filled) noexcept
Definition: ConnHandler.cc:337
SWC::Comm::ConnHandler::m_mutex
Core::MutexSptd m_mutex
Definition: ConnHandler.h:208
SWC::Comm::ConnHandlerPlain::make
static Ptr make(AppContext::Ptr &app_ctx, SocketPlain &socket)
Definition: ConnHandler.cc:569
SWC::Comm::ConnHandler::is_secure
virtual bool is_secure() const noexcept
Definition: ConnHandler.h:132
SWC::Comm::ConnHandler::Outgoing::cbuf
Buffers::Ptr cbuf
Definition: ConnHandler.h:33
SWC::Error::Exception
Definition: Exception.h:21
SWC::Comm::ConnHandler::Receiver_HeaderPrefix::~Receiver_HeaderPrefix
~Receiver_HeaderPrefix() noexcept
Definition: ConnHandler.cc:266
SWC::Comm::ConnHandler::Sender_Ack::Sender_Ack
Sender_Ack(const Sender_Ack &)=delete
SWC::Comm::ConnHandler::do_close_run
void do_close_run() noexcept
Definition: ConnHandler.cc:32
SWC::Comm::ConnHandler::Sender_noAck::cbuf
Buffers::Ptr cbuf
Definition: ConnHandler.cc:96
SWC::Comm::ConnHandler::Receiver_Buffer::operator()
void operator()(asio::error_code ec, size_t filled) noexcept
Definition: ConnHandler.cc:370
SWC::Comm::ConnHandlerSSL::socket_layer
SocketLayer *SWC_CONST_FUNC socket_layer() noexcept override
Definition: ConnHandler.cc:723
SWC::Comm::ConnHandler::Sender_Ack::~Sender_Ack
~Sender_Ack() noexcept
Definition: ConnHandler.cc:143
SWC::Comm::ConnHandler::m_outgoing
Core::QueueSafeStated< Outgoing > m_outgoing
Definition: ConnHandler.h:241
SWC::Comm::ConnHandler::Receiver_Buffer
Definition: ConnHandler.cc:286