/* callback for evconnlistener */ static void acceptcb(struct evconnlistener *listener, int fd, struct sockaddr *addr, int addrlen, void *arg) { app_context *app_ctx = (app_context*)arg; http2_session_data *session_data; session_data = create_http2_session_data(app_ctx, fd, addr, addrlen); bufferevent_setcb(session_data->bev, handshake_readcb, NULL, eventcb, session_data); }
/* Get resource denoted by the |uri|. The debug and error messages are printed in stderr, while the response body is printed in stdout. */ static void run(const char *uri) { struct http_parser_url u; char *host; uint16_t port; int rv; SSL_CTX *ssl_ctx; struct event_base *evbase; http2_session_data *session_data; /* Parse the |uri| and stores its components in |u| */ rv = http_parser_parse_url(uri, strlen(uri), 0, &u); if(rv != 0) { errx(1, "Could not parse URI %s", uri); } host = strndup(&uri[u.field_data[UF_HOST].off], u.field_data[UF_HOST].len); if(!(u.field_set & (1 << UF_PORT))) { port = 443; } else { port = u.port; } ssl_ctx = create_ssl_ctx(); evbase = event_base_new(); session_data = create_http2_session_data(evbase); session_data->stream_data = create_http2_stream_data(uri, &u); initiate_connection(evbase, ssl_ctx, host, port, session_data); free(host); host = NULL; event_base_loop(evbase, 0); event_base_free(evbase); SSL_CTX_free(ssl_ctx); }