googleapis / googleapis/google-api-nodejs-client
drive_v3 files.create unable to get resumable session URI
- 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
Assessment
This issue has not been assessed yet.