/* This creates a new connection from a listening socket */ void new_http_connection(struct http_server *http) { struct http_request *req; struct sockaddr_in client_addr; socklen_t sin_size = 0; int sock = 0; if ((sock = accept(http->sock,(struct sockaddr *)&client_addr,&sin_size)) == -1) { return; } sin_size = sizeof(struct sockaddr_in); req = new_http_request(); req->sock = sock; req->status = HTTP_NOTREADY; req->server = http; printf("Accepted new HTTP connection\n"); http->requests = http_request_add(http->requests, req); return; }
int copy_file (const char *in, const char *out) { trace ("copying %s to %s\n", in, out); if (!ensure_dir (out)) { return -1; } char tmp_out[PATH_MAX]; snprintf (tmp_out, PATH_MAX, "%s.part", out); FILE *fout = fopen (tmp_out, "w+b"); if (!fout) { trace ("artwork: failed to open file %s for writing\n", tmp_out); return -1; } DB_FILE *request = new_http_request (in); if (!request) { fclose (fout); trace ("artwork: failed to open file %s for reading\n", in); return -1; } int err = 0; int bytes_read; size_t file_bytes = 0; do { char buffer[BUFFER_SIZE]; bytes_read = deadbeef->fread (buffer, 1, BUFFER_SIZE, request); if (bytes_read < 0 || errno) { trace ("artwork: failed to read file %s: %s\n", tmp_out, strerror (errno)); err = -1; } else if (bytes_read > 0 && fwrite (buffer, bytes_read, 1, fout) != 1) { trace ("artwork: failed to write file %s: %s\n", tmp_out, strerror (errno)); err = -1; } file_bytes += bytes_read; } while (!err && bytes_read == BUFFER_SIZE); close_http_request (request); fclose (fout); if (file_bytes > 0 && !err) { err = rename (tmp_out, out); if (err) { trace ("artwork: failed to move %s to %s: %s\n", tmp_out, out, strerror (errno)); } } unlink (tmp_out); return err; }
size_t artwork_http_request (const char *url, char *buffer, const size_t buffer_size) { DB_FILE *request = new_http_request (url); if (!request) { return 0; } const size_t size = deadbeef->fread (buffer, 1, buffer_size-1, request); buffer[size] = '\0'; close_http_request (request); return size; }
struct http_request *parse_request(char *request_data, int len) { http_parser *parser = malloc(sizeof(http_parser)); http_parser_init(parser, HTTP_REQUEST); struct http_request *request = new_http_request(); parser->data = request; int res = http_parser_execute(parser, &parser_settings, request_data, len); if (res == len) { if (http_should_keep_alive(parser)) { request->flags |= F_HREQ_KEEPALIVE; } free(parser); return request; } delete_http_request(request); free(parser); return NULL; }