<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>