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.