<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
I have this code in my server app:</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
```</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
// Handles an HTTP server connection
<div>void do_session(tcp::socket &socket, ssl::context &ctx, const std::string &doc_root, std::string_view googlekey,</div>
<div>      std::string_view currencykey)</div>
<div>{</div>
<div>      bool close{};</div>
<div>      boost::system::error_code ec;</div>
<div><br>
</div>
<div>      // Construct the stream around the socket</div>
<div>      ssl::stream<tcp::socket&> stream{ socket, ctx };</div>
<div><br>
</div>
<div>      unsigned char* out[];</div>
<div>      unsigned char* outlen;</div>
<div>      const unsigned char* in[];</div>
<div>      unsigned int inlen;</div>
<div>      void* arg;</div>
<div>      void* arg2;</div>
<div><br>
</div>
<div>      for (std::size_t i{}; i < inlen; ++i)</div>
<div>      {</div>
<div>            if (in[i] == "h2")</div>
<div>            {</div>
<div>                  out[0] = "h2";</div>
<div>                  outlen = 1;</div>
<div>            }</div>
<div>      }</div>
<div><br>
</div>
<div>      // Set ALPN and select protocol from client's list</div>
<div>      SSL_CTX_set_alpn_select_cb(ctx, [](ctx,</div>
<div>            out,</div>
<div>            outlen,</div>
<div>            in,</div>
<div>            inlen,</div>
<div>            arg) {</div>
<div>                  unsigned char** out2;</div>
<div>                  unsigned char* outlen;</div>
<div>                  const unsigned char* server{ &out };</div>
<div>                  const unsigned char* client{ &in };</div>
<div>                  unsigned int server_len{ outlen };</div>
<div>                  unsigned int client_len{ inlen };</div>
<div>                  return SSL_select_next_proto(out2, outlen,</div>
<div>                        server,</div>
<div>                        server_len,</div>
<div>                        client,</div>
<div>                        client_len);</div>
<div>            }, arg2);</div>
<div><br>
</div>
<div>      // Perform the SSL handshake</div>
<div>      stream.handshake(ssl::stream_base::server, ec);</div>
<div>      if (ec)</div>
<div>      {</div>
<div>            std::cerr << "Lines 663 and 664:\n";</div>
<div>            fail(ec, "handshake");</div>
<div>      }</div>
<div><br>
</div>
<div>      // This buffer is required to persist across reads </div>
<div>      boost::beast::flat_buffer buffer;</div>
<div><br>
</div>
<div>      // This lambda is used to send messages </div>
<div>      send_lambda<ssl::stream<tcp::socket&>> lambda{ stream, close, ec };</div>
<div><br>
</div>
<div>      for (;;)</div>
<div>      {</div>
<div>            // Read a request </div>
<div>            http::request<http::string_body> req;</div>
<div>            http::read(stream, buffer, req, ec);</div>
<div>            if (ec == http::error::end_of_stream)</div>
<div>            {</div>
<div>                  break;</div>
<div>            }</div>
<div>            if (ec)</div>
<div>            {</div>
<div>                  std::cerr << "Lines 684 and 685:\n";</div>
<div>                  return fail(ec, "read");</div>
<div>            }</div>
<div><br>
</div>
<div>            // Send the response </div>
<div>            handle_request(doc_root, std::move(req), lambda, googlekey, currencykey);</div>
<div>            if (ec)</div>
<div>            {</div>
<div>                  std::cerr << "Lines 691 and 692:\n";</div>
<div>                  return fail(ec, "write");</div>
<div>            }</div>
<div>            if (close)</div>
<div>            {</div>
<div>                  // This means we should close the connection, usually because
</div>
<div>                  // the response indicated the "Connection: close" semantic.
</div>
<div>                  break;</div>
<div>            }</div>
<div>      }</div>
<div><br>
</div>
<div>      // Perform the SSL shutdown </div>
<div>      stream.shutdown(ec);</div>
<div>      if (ec)</div>
<div>      {</div>
<div>            std::cerr << "Lines 707 and 708:\n";</div>
<div>            return fail(ec, "shutdown");</div>
<div>      }</div>
<div><br>
</div>
<div>      // At this point the connection is closed gracefully</div>
}<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
```</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
Did I call the `<span style="background-color:rgb(255, 255, 255);display:inline !important">SSL_CTX_set_alpn_select_cb` function correctly?  And am I setting and passing the arguments/parameters correctly?  If I did anything wrong, please tell me.  Thanks.</span></div>
</body>
</html>