These "parts" are essentially embedded HTTP requests; the lines under each
listed GET/PUT/etc are headers for that embedded request. Here is the
structure of their example annotated:

POST /batch/farm/v1 HTTP/1.1 # actual request and headers
Authorization: Bearer your_auth_token
Host: www.googleapis.com
Content-Type: multipart/mixed; boundary=batch_foobarbaz
Content-Length: total_content_length
# rest is actual request content
--batch_foobarbaz # first multipart segment
Content-Type: application/http # multipart segment headers
Content-ID: <item1:[email protected]>

GET /farm/v1/animals/pony # multipart segment *content*

--batch_foobarbaz # second multipart segment
Content-Type: application/http # multipart segment headers
Content-ID: <item2:[email protected]>

PUT /farm/v1/animals/sheep # multipart segment *content*
Content-Type: application/json
Content-Length: part_content_length
If-Match: "etag/sheep"

{
  "animalName": "sheep",
  "animalAge": "5"
  "peltColor": "green",
}

--batch_foobarbaz # third multipart segment
Content-Type: application/http # multipart segment headers
Content-ID: <item3:[email protected]>

GET /farm/v1/animals # multipart segment *content*
If-None-Match: "etag/animals"

--batch_foobarbaz--

As noted the part where the part_content_length is is inside the content
for one of the multipart segments. Mojolicious doesn't have anything to
deal with the content of multipart segments of this type, so you need to
construct them yourself, but you could maybe leverage Mojolicious's
existing ability to construct such HTTP requests.

my $embedded_tx = $ua->build_tx(PUT => '/farm/v1/animals/sheep',
{'If-Match' => 'etag/sheep'}, json => $sheep_data);
...
my $multipart_tx = $ua->post('/batch/farm/v1' => $headers => multipart => [
  {content => $embedded_tx->req->to_string, 'Content-Type' =>
'application/http'},
  ...
]);

Hope that helps,
-Dan

On Tue, Sep 18, 2018 at 12:50 PM Steve Dondley <[email protected]> wrote:

> I'm starting a new thread related to the previous one regarding making a
> batch api request to Google's API. I keep getting "Bad Reqeust" responses
> from Google after making a batch API call (other calls work fine).
>
> Looking at the api documentation for batch api requests
> <https://developers.google.com/gmail/api/guides/batch> it says each part
> of the multipart request should have a content length. Here is the example
> Google supplies:
>
> POST /batch/farm/v1 HTTP/1.1
> Authorization: Bearer your_auth_token
> Host: www.googleapis.com
> Content-Type: multipart/mixed; boundary=batch_foobarbaz
> Content-Length: total_content_length
>
> --batch_foobarbaz
> Content-Type: application/http
> Content-ID: <item1:[email protected]>
>
> GET /farm/v1/animals/pony
>
> --batch_foobarbaz
> Content-Type: application/http
> Content-ID: <item2:[email protected]>
>
> PUT /farm/v1/animals/sheep
> Content-Type: application/json
> Content-Length: part_content_length
> If-Match: "etag/sheep"
>
> {
>   "animalName": "sheep",
>   "animalAge": "5"
>   "peltColor": "green",
> }
>
> --batch_foobarbaz
> Content-Type: application/http
> Content-ID: <item3:[email protected]>
>
> GET /farm/v1/animals
> If-None-Match: "etag/animals"
>
> --batch_foobarbaz--
>
>
>
> The requests I'm generating with mojolicious do not have the
> "part_content_length." Here's mine:
>
> POST /batch/gmail/v1 HTTP/1.1
> Authorization: Bearer A_REAL_TOKEN_GOES_HERE
> Host: www.googleapis.com
> Accept-Encoding: gzip
> Content-Length: 120
> User-Agent: Mojolicious (Perl)
> Content-Type: multipart/mixed; boundary=nS2CX
>
>
> --nS2CX
> Content-Type: application/http
>
>
> GET /gmail/v1/users/[email protected]/messages/165eb111fcf21503
> --nS2CX--
>
>
>
> My question is, does Mojolicious provide a way to automatically generate a
> content length header for these parts? If not, which parts of the message
> get counted toward this length and how do I calculate it (assuming UTF-8)?
>
> --
> You received this message because you are subscribed to the Google Groups
> "Mojolicious" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/mojolicious.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Mojolicious" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.

Reply via email to