コード例 #1
0
ファイル: http_proto.c プロジェクト: Estella/trollbot
/* 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; 
}
コード例 #2
0
ファイル: artwork_internal.c プロジェクト: AriaAsuka/deadbeef
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;
}
コード例 #3
0
ファイル: artwork_internal.c プロジェクト: AriaAsuka/deadbeef
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;
}
コード例 #4
0
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;
}