Skip to content

Upload a project avatar - PUT + "Header: Content-Type" #53

Open
@g0tmi1k

Description

@g0tmi1k

Goal: Using devscript's salsa, I'm trying to open new a new merge request which supports setting a project's avatar.


Requirement: Looking at GitLab's API:

To upload an avatar from your file system, use the --form argument. This causes cURL to post data using the header Content-Type: multipart/form-data. The file= parameter must point to an image file on your file system and be preceded by @.


Trace log:

salsa's lib/Devscripts/Salsa/update_repo.pm:

[...]
use GitLab::API::v4::Constants qw(:all);
[...]
        eval {
            # apply new parameters
            $self->api->edit_project($id,
                { %$configparams, $self->desc($repo->[1]) });

Looking at $self->api->edit_project, it uses GitLab::API::v4:

[...]
sub edit_project {
    my $self = shift;
    croak 'edit_project must be called with 1 to 2 arguments' if @_ < 1 or @_ > 2;
    croak 'The #1 argument ($project_id) to edit_project must be a scalar' if ref($_[0]) or (!defined $_[0]);
    croak 'The last argument (\%params) to edit_project must be a hash ref' if defined($_[1]) and ref($_[1]) ne 'HASH';
    my $params = (@_ == 2) ? pop() : undef;
    my $options = {};
    $options->{decode} = 0;
    $options->{content} = $params if defined $params;
    $self->_call_rest_client( 'PUT', 'projects/:project_id', [@_], $options );
    return;
}

The user input goes to: $options->{content}. We can't say do: $options->{headers}

Following it to $self->_call_rest_client:

[...]
sub _call_rest_client {
    my ($self, $verb, $path, $path_vars, $options) = @_;

    $options->{headers} = $self->_auth_headers();

    return $self->rest_client->request(
        $verb, $path, $path_vars, $options,
    );
}

As a result, this makes a PUT request, but doesn't have the Content-Type: multipart/form-data set in the header. There doesn't appear to be any where to be able to add custom headers in the request.


Error:
When you try and make the request without it being set:

root@debian:~# perl scripts/salsa.pl --conf-file config.conf update_safe test123 --avatar-path=./icon.png  --debug --verbose
[...]
salsa.pl info: Error PUTing https://gitlab.com/api/v4/projects/123 (HTTP 400): Bad Request {"error":"avatar is invalid"} at /root/devscripts/lib/Devscripts/Salsa/update_repo.pm line 79.

This code hasn't been committed publicly

Other people getting the same error response: #1


Possible solutions:

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions