int tcp_connector::connect(unsigned int ip, unsigned short port, handler* hdr){ /*create socket*/ int sock = async_tcp_connect(ip, port); if(sock < 0){ return -1; } /*set the session property of the handler*/ hdr->sock(sock); hdr->remote_ip(ip); hdr->remote_port(port); /*track the connect result for the handler*/ if(this->track(hdr) != 0){ return -1; } return 0; }
int HTTPConnectionCreateOutgoing(strarg_t const domain, unsigned const flags, HTTPConnectionRef *const out) { str_t host[1023+1]; str_t service[15+1]; host[0] = '\0'; service[0] = '\0'; int matched = sscanf(domain, "%1023[^:]:%15[0-9]", host, service); if(matched < 1) return UV_EINVAL; if('\0' == host[0]) return UV_EINVAL; static struct addrinfo const hints = { .ai_flags = AI_V4MAPPED | AI_ADDRCONFIG | AI_NUMERICSERV, .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM, .ai_protocol = 0, // ??? }; struct addrinfo *info = NULL; HTTPConnectionRef conn = NULL; int rc; rc = async_getaddrinfo(host, service[0] ? service : "80", &hints, &info); if(rc < 0) goto cleanup; conn = calloc(1, sizeof(struct HTTPConnection)); if(!conn) rc = UV_ENOMEM; if(rc < 0) goto cleanup; rc = UV_EADDRNOTAVAIL; for(struct addrinfo *each = info; each; each = each->ai_next) { rc = uv_tcp_init(async_loop, conn->stream); if(rc < 0) break; rc = async_tcp_connect(conn->stream, each->ai_addr); if(rc >= 0) break; async_close((uv_handle_t *)conn->stream); } if(rc < 0) goto cleanup; http_parser_init(conn->parser, HTTP_RESPONSE); conn->parser->data = conn; *out = conn; conn = NULL; cleanup: uv_freeaddrinfo(info); info = NULL; HTTPConnectionFree(&conn); return rc; } void HTTPConnectionFree(HTTPConnectionRef *const connptr) { HTTPConnectionRef conn = *connptr; if(!conn) return; async_close((uv_handle_t *)conn->stream); // http_parser does not need to be freed, closed or destroyed. memset(conn->parser, 0, sizeof(*conn->parser)); FREE(&conn->buf); *conn->raw = uv_buf_init(NULL, 0); conn->type = HTTPNothing; *conn->out = uv_buf_init(NULL, 0); conn->flags = 0; assert_zeroed(conn, 1); FREE(connptr); conn = NULL; }