int http_session_create(struct http_server_t *server, socket_t socket, const struct sockaddr* sa, socklen_t salen) { struct http_session_t *session; struct aio_tcp_transport_handler_t handler; memset(&handler, 0, sizeof(handler)); handler.ondestroy = http_session_ondestroy; handler.onrecv = http_session_onrecv; handler.onsend = http_session_onsend; session = (struct http_session_t *)malloc(sizeof(*session) + 2 * 1024 + HTTP_RECV_BUFFER); if (!session) return -1; memset(session, 0, sizeof(*session)); session->header = (char*)(session + 1); session->header_capacity = 2 * 1024; session->data = session->header + session->header_capacity; session->parser = http_parser_create(HTTP_PARSER_SERVER); assert(AF_INET == sa->sa_family || AF_INET6 == sa->sa_family); assert(salen <= sizeof(session->addr)); memcpy(&session->addr, sa, salen); session->addrlen = salen; session->socket = socket; session->param = server->param; session->handler = server->handler; session->transport = aio_tcp_transport_create(socket, &handler, session); if (0 != aio_tcp_transport_recv(session->transport, session->data, HTTP_RECV_BUFFER)) { aio_tcp_transport_destroy(session->transport); return -1; } return 0; }
void* http_server_create(const char* ip, int port) { socket_t socket; struct http_server_t *ctx; struct aio_tcp_transport_handler_t handler; // create server socket socket = tcpserver_create(ip, port, 64); if(socket_invalid == socket) { printf("http_server_create(%s, %d): create socket error.\n", ip, port); return NULL; } ctx = (struct http_server_t*)malloc(sizeof(ctx[0])); if(!ctx) return NULL; memset(ctx, 0, sizeof(ctx[0])); handler.onconnected = http_session_onconnected; handler.ondisconnected = http_session_ondisconnected; handler.onrecv = http_session_onrecv; handler.onsend = http_session_onsend; ctx->transport = aio_tcp_transport_create(socket, &handler, ctx); if(!ctx->transport) { printf("http_server_create(%s, %d) create aio transport error.\n", ip, port); http_server_destroy(ctx); return NULL; } return ctx; }