I think you missed something in my post. You should not need to add any
content length headers yourself.

-Dan

On Tue, Sep 18, 2018 at 1:28 PM Steve Dondley <sdond...@gmail.com> wrote:

> Thanks. It doesn't look like adding the content-length helped. Still
> getting 400 errors. And I just noticed that in Google's example there is no
> content-length header for a GET request. Don't know what else to try now.
>
> On Tuesday, September 18, 2018 at 1:06:23 PM UTC-4, Dan Book wrote:
>>
>> 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:1...@barnyard.example.com>
>>
>> GET /farm/v1/animals/pony # multipart segment *content*
>>
>> --batch_foobarbaz # second multipart segment
>> Content-Type: application/http # multipart segment headers
>> Content-ID: <item2:1...@barnyard.example.com>
>>
>> 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:1...@barnyard.example.com>
>>
>> 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 <sdon...@gmail.com> 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:1...@barnyard.example.com>
>>>
>>> GET /farm/v1/animals/pony
>>>
>>> --batch_foobarbaz
>>> Content-Type: application/http
>>> Content-ID: <item2:1...@barnyard.example.com>
>>>
>>> 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:1...@barnyard.example.com>
>>>
>>> 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/sdond...@gmail.com/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 mojolicious...@googlegroups.com.
>>> To post to this group, send email to mojol...@googlegroups.com.
>>> 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 mojolicious+unsubscr...@googlegroups.com.
> To post to this group, send email to mojolicious@googlegroups.com.
> 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 mojolicious+unsubscr...@googlegroups.com.
To post to this group, send email to mojolicious@googlegroups.com.
Visit this group at https://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.

Reply via email to