nylas / nylas/nylas-python

Bug: drafts.create() fails with TypeError for multipart requests (attachments > 3MB)

Open
#454 3 comments 0 reactions 1 assignee View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
109
Forks
85
Avg merge
1d 21h
Merged PRs (30d)
1

Description

Bug Description

When creating a draft with attachments larger than 3MB (which triggers multipart upload), the SDK throws a TypeError: tuple indices must be integers or slices, not str.

Root Cause

In nylas/resources/drafts.py, the create() method (lines 117-124) doesn't properly unpack the tuple returned by _execute():

# Current buggy code (line 117-124):
if attachment_size >= MAXIMUM_JSON_ATTACHMENT_SIZE:
    json_response = self._http_client._execute(  # Returns (json_response, headers) tuple!
        method="POST",
        path=path,
        data=_build_form_request(request_body),
        overrides=overrides,
    )
    return Response.from_dict(json_response, Draft)  # Fails - json_response is a tuple

Compare with the correct implementation in send() method (lines 222-228):

# Correct code in send():
json_response, headers = self._http_client._execute(  # Properly unpacks tuple
    method="POST",
    path=f"/v3/grants/{identifier}/drafts/{urllib.parse.quote(draft_id, safe='')}",
    overrides=overrides,
)
return Response.from_dict(json_response, Message, headers)  # Works correctly

Steps to Reproduce

import os
import tempfile
from nylas import Client
from nylas.utils.file_utils import attach_file_request_builder

client = Client(api_key="your_api_key", api_uri="https://api.us.nylas.com")

# Create a temp file > 3MB to trigger multipart
with tempfile.NamedTemporaryFile(delete=False, suffix=".bin") as f:
    f.write(b"x" * (4 * 1024 * 1024))  # 4MB file
    temp_path = f.name

try:
    attachment = attach_file_request_builder(temp_path)
    
    response = client.drafts.create(
        identifier="your_grant_id",
        request_body={
            "to": [{"email": "test@example.com"}],
            "subject": "Test with large attachment",
            "body": "Testing multipart upload",
            "attachments": [attachment],
        }
    )
except TypeError as e:
    print(f"Error: {e}")  # "tuple indices must be integers or slices, not str"
finally:
    os.remove(temp_path)

Expected Behavior

Draft should be created successfully and return a Response[Draft] object.

Actual Behavior

Throws TypeError: tuple indices must be integers or slices, not str

Suggested Fix

# In nylas/resources/drafts.py, change lines 117-124 to:
if attachment_size >= MAXIMUM_JSON_ATTACHMENT_SIZE:
    json_response, headers = self._http_client._execute(  # Unpack tuple
        method="POST",
        path=path,
        data=_build_form_request(request_body),
        overrides=overrides,
    )
    return Response.from_dict(json_response, Draft, headers)  # Pass headers

Environment

  • nylas-python version: 6.x (tested on latest)
  • Python version: 3.12

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.