omarryhan/aiogoogle

Gmail Message with upload_file doesn't work

Closed this issue · 3 comments

Sending an gmail using /upload endpoint fails with either of there two error messages in response:

  1. Reciepient should be provided
  2. application/json can't be used as media type
    I couldn't find any restrictions in google docs but from trial and error it seems like application/json mime should be included always and should be before message/rfc822.
# Fails as `Reciepient` should be defined, happens in aiogoogle if json is None
Mime:
     message/rfc822

# Fails as `application/json` can't be used as media type, happens in aiogoogle if json is not None
Mime:
     message/rfc822
     application/json

# Works always
Mime
    application/json  # can be empty
    message/rfc822

Rough Code:

# works
req = gmail.users.messages.send(userId='me', json={"raw": base_64(mime.as_bytes()).decode()})

# fails Error- 1
file.write(mime.as_bytes())
req = gmail.users.messages.send(userId='me',upload_file=file.path, json={})
req.upload_file_content_type = "message/rfc822"


# fails Error- 2
file.write(mime.as_bytes())
req = gmail.users.messages.send(userId='me',upload_file=file.path, json={"threadId": "some thread id"})
req.upload_file_content_type = "message/rfc822"

For me these changes fixes the issue: nkitsaini@6f3445b. I can make a pull request if the changes seems okay.

Hey @nkitsaini

Thanks for taking the time to file this issue!
I'm suspecting that attaching a None json part might break some of the APIs supported by this lib like Google Drive and Google Cloud Store. So, I still need to test these. I'm on a vacation now, so unfortunately, I can't run any tests. Should be all done in 5-7 days.

If you're on a hurry, you can help me test these changes and I will merge your PR right after you can confirm that both Google Drive and Google Cloud Store are able to upload multipart files with:

  1. json = None
  2. json being appended before the body.

Thanks again!

Sure, no problem. I'm using the fork for now. I'll test these cases tomorrow, most probably it should work as google-api-python-client also attaches the body part first and does it always:
https://github.com/googleapis/google-api-python-client/blob/2565803cd363f48cf3c00a23cd8760bd6db4de06/googleapiclient/discovery.py#L1138
Also can you please take a quick look at the implementation there, just to be sure I'm not missing something.

Thanks @nkitsaini
I just checked and your suggested change works as expected.
I just pushed a fix and will release it in the 2.0.1 version.