struct http_t *net_http_new(struct http_connection_t *conn) { bool error; int fd = -1; struct http_t *state = NULL; if (!conn) goto error; fd = net_http_new_socket(conn->domain, conn->port); if (fd == -1) goto error; error=false; /* This is a bit lazy, but it works. */ net_http_send_str(fd, &error, "GET /"); net_http_send_str(fd, &error, conn->location); net_http_send_str(fd, &error, " HTTP/1.1\r\n"); net_http_send_str(fd, &error, "Host: "); net_http_send_str(fd, &error, conn->domain); if (conn->port != 80) { char portstr[16] = {0}; snprintf(portstr, sizeof(portstr), ":%i", conn->port); net_http_send_str(fd, &error, portstr); } net_http_send_str(fd, &error, "\r\n"); net_http_send_str(fd, &error, "Connection: close\r\n"); net_http_send_str(fd, &error, "\r\n"); if (error) goto error; state = (struct http_t*)malloc(sizeof(struct http_t)); state->fd = fd; state->status = -1; state->data = NULL; state->part = P_HEADER_TOP; state->bodytype= T_FULL; state->error = false; state->pos = 0; state->len = 0; state->buflen = 512; state->data = (char*)malloc(state->buflen); if (!state->data) goto error; return state; error: if (fd != -1) socket_close(fd); return NULL; }
struct http_t *net_http_new(struct http_connection_t *conn) { bool error = false; int fd = -1; struct http_t *state = NULL; if (!conn) goto error; fd = net_http_new_socket(conn); if (fd < 0) goto error; error = false; /* This is a bit lazy, but it works. */ if (conn->methodcopy) { net_http_send_str(&conn->sock_state, &error, conn->methodcopy); net_http_send_str(&conn->sock_state, &error, " /"); } else { net_http_send_str(&conn->sock_state, &error, "GET /"); } net_http_send_str(&conn->sock_state, &error, conn->location); net_http_send_str(&conn->sock_state, &error, " HTTP/1.1\r\n"); net_http_send_str(&conn->sock_state, &error, "Host: "); net_http_send_str(&conn->sock_state, &error, conn->domain); if (!conn->port) { char portstr[16]; portstr[0] = '\0'; snprintf(portstr, sizeof(portstr), ":%i", conn->port); net_http_send_str(&conn->sock_state, &error, portstr); } net_http_send_str(&conn->sock_state, &error, "\r\n"); /* this is not being set anywhere yet */ if (conn->contenttypecopy) { net_http_send_str(&conn->sock_state, &error, "Content-Type: "); net_http_send_str(&conn->sock_state, &error, conn->contenttypecopy); net_http_send_str(&conn->sock_state, &error, "\r\n"); } if (conn->methodcopy && (string_is_equal(conn->methodcopy, "POST"))) { size_t post_len, len; char *len_str = NULL; if (!conn->postdatacopy) goto error; if (!conn->contenttypecopy) net_http_send_str(&conn->sock_state, &error, "Content-Type: application/x-www-form-urlencoded\r\n"); net_http_send_str(&conn->sock_state, &error, "Content-Length: "); post_len = strlen(conn->postdatacopy); #ifdef _WIN32 len = snprintf(NULL, 0, "%" PRIuPTR, post_len); len_str = (char*)malloc(len + 1); snprintf(len_str, len + 1, "%" PRIuPTR, post_len); #else len = snprintf(NULL, 0, "%llu", (long long unsigned)post_len); len_str = (char*)malloc(len + 1); snprintf(len_str, len + 1, "%llu", (long long unsigned)post_len); #endif len_str[len] = '\0'; net_http_send_str(&conn->sock_state, &error, len_str); net_http_send_str(&conn->sock_state, &error, "\r\n"); free(len_str); } net_http_send_str(&conn->sock_state, &error, "User-Agent: libretro\r\n"); net_http_send_str(&conn->sock_state, &error, "Connection: close\r\n"); net_http_send_str(&conn->sock_state, &error, "\r\n"); if (conn->methodcopy && (string_is_equal(conn->methodcopy, "POST"))) net_http_send_str(&conn->sock_state, &error, conn->postdatacopy); if (error) goto error; state = (struct http_t*)malloc(sizeof(struct http_t)); state->sock_state = conn->sock_state; state->status = -1; state->data = NULL; state->part = P_HEADER_TOP; state->bodytype= T_FULL; state->error = false; state->pos = 0; state->len = 0; state->buflen = 512; state->data = (char*)malloc(state->buflen); if (!state->data) goto error; return state; error: if (conn) { if (conn->methodcopy) free(conn->methodcopy); if (conn->contenttypecopy) free(conn->contenttypecopy); conn->methodcopy = NULL; conn->contenttypecopy = NULL; conn->postdatacopy = NULL; } #ifdef HAVE_SSL if (conn && conn->sock_state.ssl && conn->sock_state.ssl_ctx && fd >= 0) { ssl_socket_close(conn->sock_state.ssl_ctx); ssl_socket_free(conn->sock_state.ssl_ctx); conn->sock_state.ssl_ctx = NULL; } #else if (fd >= 0) socket_close(fd); #endif if (state) free(state); return NULL; }