googleapis / googleapis/google-api-nodejs-client

drive_v3 files.create unable to get resumable session URI

Open
#3,426 1 comment 1 reaction 0 assignees View on GitHub
api: drive priority: p3 type: feature request
Dominant language
TypeScript
Stars
12.2k
Forks
2k
Avg merge
1d 9h
Merged PRs (30d)
24

Description

### Feature
I think that would be nice to be able to get the resumable session URI by specifying the uploadType: 'resumable' parameters on the drive_v3 files.create method, instead of doing a POST request.

```javascript
const params = {
uploadType: 'resumable'
};

const options = {};

const res = await drive.files.create(params, options);
const uri = res.headers.location;
```

### Motivation
Initially I thought that was the case by reading the documentation on how to perform a resumable upload ([link](https://developers.google.com/drive/api/guides/manage-uploads#resumable)).
So I take a look at the code to understand how to do that but unfortunately it seems impossible.

To summarise the documentation to get a resumable URI we need to do a POST like so:
`POST https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable`

If we take a look at how the create method it's implemented we found out that we have this URI in to the `mediaUrl` attribute. ([link](https://github.com/googleapis/google-api-nodejs-client/blob/666c9e133f3ed00425e13a70d08da06353ce11cb/src/apis/drive/v3.ts#L3376))

If we take a look how the request it's constructed we found out that only when we have the `media.body` the correct url it's used. But then the `uploadType` it's changed in to something else. So the POST request can't be constructed as desired. ([link](https://github.com/googleapis/nodejs-googleapis-common/blob/73af0ceae7278ec436570ff6f4bcd4c58333fab6/src/apirequest.ts#L253))

### Solution
In this case a first simple fix would be modify the createAPIRequestAsync of googleapis-common to add another if statement to enforce the right URI when we have an empty body and the `uploadType` is set to `"resumable"`. Pretty much like so:

```javascript
if (parameters.mediaUrl && media.body) {
options.url = parameters.mediaUrl;
if (resource) {
params.uploadType = 'multipart';
// more code
} else {
params.uploadType = 'media';
// more code
}
} else if (parameters.mediaUrl && params.uploadType === 'resumable') {
options.url = parameters.mediaUrl;
} else {
options.data = resource || undefined;
}
```

The current solution that I could find instead is to override the URI in the options like so:

```javascript
const options = {
rootUrl: 'https://www.googleapis.com/upload'
};
```

Please let me know if i'm missing something or if I should proceed with a pull request on nodejs-googleapis-common repository.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.