Resumable uploads stopped working through Obj-C API (503 error)?

48 views
Skip to first unread message

Christoph Z.

unread,
Nov 24, 2010, 2:36:10 PM11/24/10
to Google Data APIs Objective-C Client Library Discussion
We've had this code working without any problems in production for
months. In the past two days we've gotten a number of support requests
indicating that uploads no longer work. When I debugged this, it looks
like we are getting 503 error.

Is this a know problem? Is this a server issue that is going to be
resolved or API issue that requires application update? Are there any
workarounds?

Any help would be greatly appreciated. This affects over 100k of our
iPhone users. It impacts critical functionality, so as you can
imagine, we are very concerned about it.

Thanks,
Christoph

Christoph Z.

unread,
Nov 24, 2010, 4:38:11 PM11/24/10
to Google Data APIs Objective-C Client Library Discussion
It looks like the problem is with multiple-server requests in
resumable upload API. Uploads that fit into single chunk work.

Steps to reproduce issue:

1. Set default upload chunk size to 75000 (this is the default used in
GData Obj-C API on the iPhone)
2. Upload a PDF file larger than the upload chunk size

Actual results:

Upload fails with either status 503 or too many redirects.

Here's a link to a sample PDF file which can be used to repro the
problem:

http://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ViewControllerPGforiPhoneOS.pdf

Below is a snippet from sample trace. I've opened bug
http://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=2315
to track this.

2010-11-24 13:15:35 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UoL1O_bSKe9etXkZeLFaKKr1QAgNvlW30BarGMW_NyTvvQ6jMg9MOtuGwwVDRf6v4a580YxHcnkzbfchbwWWTMW4FY-rQ
request headers (4)

{
"Content-Length" = 1048576;
"Content-Range" = "bytes 0-1048575/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}

posted data (1048576 bytes)
<<1048576 bytes>>

response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 21:10:53 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2UoL1O_bSKe9etXkZeLFaKKr1QAgNvlW30BarGMW_NyTvvQ6jMg9MOtuGwwVDRf6v4a580YxHcnkzbfchbwWWTMW4FY-
rQ";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 13:15:47 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UoL1O_bSKe9etXkZeLFaKKr1QAgNvlW30BarGMW_NyTvvQ6jMg9MOtuGwwVDRf6v4a580YxHcnkzbfchbwWWTMW4FY-rQ
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 1048576;
"Content-Range" = "bytes 0-1048575/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (1048576 bytes)
<<1048576 bytes>>

response: status: 503 MIMEType: text/html
response headers (7)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 21:11:05 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

Greg Robbins

unread,
Nov 24, 2010, 5:09:50 PM11/24/10
to gdata-objec...@googlegroups.com
The library currently uses 256K as the minimum chunk size due to some server problems with smaller chunks; the logic is at


But the http log in the previous message shows a sufficiently large chunk being uploaded. I'll ask the server team to look at the issue.

Greg Robbins

unread,
Nov 24, 2010, 5:31:19 PM11/24/10
to gdata-objec...@googlegroups.com
The http log shows two attempts to upload the range 0-1048575, with the first succeeding and the second returning a 503 error. But that doesn't make sense; if the first succeeds, the next chunk should be starting at byte 1048576. Are those log snippets from different attempts to upload the same file?

Also, the http log is missing the initial request, which includes no upload bytes but just asks the server to return a Location header with the URL to which chunks should be uploaded.

Christoph Z.

unread,
Nov 24, 2010, 6:06:07 PM11/24/10
to Google Data APIs Objective-C Client Library Discussion
Thank you for looking into it. You are right - the exact behavior
depends on the chunk size.

The iPhone app that we shipped uses 256 KB yet it still fails as of
yesterday.

I've attached traces for 75 KB and 1 MB. The first one fails with
status 404, the latter with 503. You can repro the problem using the
Obj-C DocsSample app and the PDF file I mentioned in the original
post. I am running the latest production v1.10.0 of gdata-objectivec-
client.

Apologies for the length of this mail - the trace is completely
unabridged.

Have a great day!
-Christoph



================
CHUNK SIZE 75000
================

2010-11-24 14:55:30 -0800
request: POST URL: https://docs.google.com/feeds/upload/create-session/default/private/full
request headers (10)

{
Accept = "application/atom+xml, text/xml";
Authorization = "GoogleLogin auth=xxx";
"Cache-Control" = "no-cache";
"Content-Length" = 382;
"Content-Type" = "application/atom+xml; charset=utf-8";
"Gdata-Version" = "3.0";
Slug = "ViewControllerPGforiPhoneOS.pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
"X-Upload-Content-Length" = 0;
"X-Upload-Content-Type" = "application/pdf";
}


posted data (382 bytes)
<?xml version="1.0" encoding="UTF-8"?> <entry xmlns="http://www.w3.org/
2005/Atom" xmlns:gd="http://schemas.google.com/g/2005"
xmlns:app="http://www.w3.org/2007/app" xmlns:docs="http://
schemas.google.com/docs/2007"> <title>ViewControllerPGforiPhoneOS.pdf</
title> <category term="http://schemas.google.com/docs/2007#pdf"
scheme="http://schemas.google.com/g/2005#kind"/> </entry>

response: status: 200 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:50:49 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-
UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--
OunOQ";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 14:55:32 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--OunOQ
request headers (4)

{
"Content-Length" = 75000;
"Content-Range" = "bytes 0-74999/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (75000 bytes)
<<75000 bytes>>

response: status: 308 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:50:50 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-
UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--
OunOQ";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 14:55:33 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--OunOQ
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 75000;
"Content-Range" = "bytes 0-74999/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (75000 bytes)
<<75000 bytes>>

response: status: 308 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:50:51 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-
UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--
OunOQ";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 14:55:34 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--OunOQ
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 75000;
"Content-Range" = "bytes 0-74999/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (75000 bytes)
<<75000 bytes>>

response: status: 308 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:50:52 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-
UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--
OunOQ";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 14:55:35 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--OunOQ
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 75000;
"Content-Range" = "bytes 0-74999/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (75000 bytes)
<<75000 bytes>>

response: status: 308 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:50:53 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-
UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--
OunOQ";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 14:55:36 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--OunOQ
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 75000;
"Content-Range" = "bytes 0-74999/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (75000 bytes)
<<75000 bytes>>

response: status: 308 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:50:54 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-
UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--
OunOQ";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 14:55:37 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--OunOQ
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 75000;
"Content-Range" = "bytes 0-74999/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (75000 bytes)
<<75000 bytes>>

response: status: 308 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:50:55 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-
UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--
OunOQ";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 14:55:38 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--OunOQ
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 75000;
"Content-Range" = "bytes 0-74999/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (75000 bytes)
<<75000 bytes>>

response: status: 308 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:50:56 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-
UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--
OunOQ";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 14:55:39 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--OunOQ
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 75000;
"Content-Range" = "bytes 0-74999/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (75000 bytes)
<<75000 bytes>>

response: status: 308 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:50:57 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-
UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--
OunOQ";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 14:55:40 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--OunOQ
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 75000;
"Content-Range" = "bytes 0-74999/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (75000 bytes)
<<75000 bytes>>

response: status: 308 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:50:58 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-
UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--
OunOQ";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 14:55:41 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--OunOQ
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 75000;
"Content-Range" = "bytes 0-74999/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (75000 bytes)
<<75000 bytes>>

response: status: 308 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:50:59 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-
UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--
OunOQ";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 14:55:42 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--OunOQ
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 75000;
"Content-Range" = "bytes 0-74999/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (75000 bytes)
<<75000 bytes>>

response: status: 308 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:51:00 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-
UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--
OunOQ";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 14:55:43 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--OunOQ
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 75000;
"Content-Range" = "bytes 0-74999/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (75000 bytes)
<<75000 bytes>>

response: status: 308 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:51:02 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-
UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--
OunOQ";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 14:55:44 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--OunOQ
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 75000;
"Content-Range" = "bytes 0-74999/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (75000 bytes)
<<75000 bytes>>

response: status: 308 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:51:03 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-
UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--
OunOQ";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 14:55:47 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2UqH_FQMx1WxARxi-IW1id-UXkC4Ge_HsRI0DZoT7YYpIM8Pmb22OFmddDkRUU3QaIqwKMwV9tor-7S9h0YWy-2--OunOQ
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 75000;
"Content-Range" = "bytes 0-74999/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (75000 bytes)
<<75000 bytes>>

response: status: 404 MIMEType: text/html
response headers (7)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:51:06 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes


====================
CHUNK SIZE 1024x1024
====================

2010-11-24 15:00:23 -0800
request: POST URL: https://docs.google.com/feeds/upload/create-session/default/private/full
request headers (10)

{
Accept = "application/atom+xml, text/xml";
Authorization = "GoogleLogin auth=xxx";
"Cache-Control" = "no-cache";
"Content-Length" = 382;
"Content-Type" = "application/atom+xml; charset=utf-8";
"Gdata-Version" = "3.0";
Slug = "ViewControllerPGforiPhoneOS.pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
"X-Upload-Content-Length" = 0;
"X-Upload-Content-Type" = "application/pdf";
}


posted data (382 bytes)
<?xml version="1.0" encoding="UTF-8"?> <entry xmlns="http://www.w3.org/
2005/Atom" xmlns:gd="http://schemas.google.com/g/2005"
xmlns:app="http://www.w3.org/2007/app" xmlns:docs="http://
schemas.google.com/docs/2007"> <title>ViewControllerPGforiPhoneOS.pdf</
title> <category term="http://schemas.google.com/docs/2007#pdf"
scheme="http://schemas.google.com/g/2005#kind"/> </entry>

response: status: 200 MIMEType: text/html
response headers (8)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:55:41 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:37 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (4)

{
"Content-Length" = 1048576;
"Content-Range" = "bytes 0-1048575/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (1048576 bytes)
<<1048576 bytes>>

response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:55:55 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:49 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 1048576;
"Content-Range" = "bytes 0-1048575/10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


posted data (1048576 bytes)
<<1048576 bytes>>

response: status: 503 MIMEType: text/html
response headers (7)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:07 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Pragma = "no-cache";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:51 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:09 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:51 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:09 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:51 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:09 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:51 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:10 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:51 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:10 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:51 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:10 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:51 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:10 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:52 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:10 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:52 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:10 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:52 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:11 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:52 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:11 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:52 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:11 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:52 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:11 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:53 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:11 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:53 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:11 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:53 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:12 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


Response data: 0 bytes

2010-11-24 15:00:53 -0800
request: PUT URL:
https://docs.google.com/feeds/upload/create-session/default/private/full?upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q
request headers (7)

{
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Length" = 0;
"Content-Range" = "bytes */10270237";
"Content-Type" = "application/pdf";
"User-Agent" = "com.example.DocsSample-1.0 GData-ObjectiveC/1.10
MacOSX/10.6.5 (gzip)";
}


response: status: 308 MIMEType: text/html
response headers (9)

{
"Cache-Control" = "no-cache, no-store, must-revalidate";
"Content-Length" = 0;
"Content-Type" = "text/html";
Date = "Wed, 24 Nov 2010 22:56:12 GMT";
Expires = "Fri, 01 Jan 1990 00:00:00 GMT";
Location = "https://docs.google.com/feeds/upload/create-session/
default/private/full?
upload_id=AEnB2Uqac9-355T1rw08UoVqhWzssgl9PFRX0JrPNtVsc8FIJkjWTw-
Mc2xQUuJdaobMrJGDdVj-BOkedIbrXl60rd0H0zsl_Q";
Pragma = "no-cache";
Range = "bytes=0-1048575";
Server = "Upload Server Built on Nov 18 2010 17:19:36
(1290129576)";
}


error: Error Domain=NSURLErrorDomain Code=-1007 UserInfo=0x372b80 "too
many HTTP redirects" Underlying Error=(Error
Domain=kCFErrorDomainCFNetwork Code=-1007 UserInfo=0x3a9c20 "too many
HTTP redirects")
Response data: 0 bytes

Greg Robbins

unread,
Nov 24, 2010, 6:34:58 PM11/24/10
to gdata-objec...@googlegroups.com
Please use the top-of-trunk library, not the 1.10 release. It has appropriate chunk size defaults, as well as http log requests/responses that are much easier to copy and paste.

The server team is aware of issues with chunks smaller than 256K and apps should not use chunks that small.

Using the DocsSample application, I was able to upload the pdf file from the issue report several times without error.

Christoph Z.

unread,
Nov 24, 2010, 6:50:59 PM11/24/10
to Google Data APIs Objective-C Client Library Discussion
Hi Greg,

It looks like resumable uploads are broken for chunks smaller or
*equal* to 256 K. The app that we have in production uses 256 K and
stopped working yesterday. By the way, the top-of-trunk still uses 256
K on older iphones (which won't work in this case) :

if (![GDataHTTPFetcher doesSupportSentDataCallback]) {
// for iPhone 2, we need a small upload chunk size so there
// are frequent intrachunk callbacks for progress monitoring
//
// Picasa Web Albums has a minimum 256K chunk size when
uploading photos
val = 256*1024;
} else {
val = 1024*1024;
}

Upgrading to top-of-trunk sources is trivial for development and our
next update, but the recent server change is a breaking change that
affects our existing customers. Updating an app in the AppStore is a
7-10 days process. Given Xmas iTunes Connect shutdown between 12/24
and EOY, we might not even be able to get an update approved before
January. A broken functionality means significant loss in revenue. As
you can imagine - this is a huge concern to us.

When you say that server team is aware of the issues with chunks
smaller than 256 K - do you mean we can expect a fix shortly or it
won't ever be fixed? I do not intend to use chunks smaller than 256 K.
It's just that as of today, 256 K doesn't work anymore in v1.10.0 and
that's what we've been shipping for months.

Thanks,
Christoph

Christoph Z.

unread,
Nov 24, 2010, 6:52:52 PM11/24/10
to Google Data APIs Objective-C Client Library Discussion
By the way - to repro it using the DocsSample app, I've added the line
below to uploadFileAtPath:

[service setServiceUploadChunkSize:256*1024];

Christoph Z.

unread,
Nov 24, 2010, 8:32:01 PM11/24/10
to Google Data APIs Objective-C Client Library Discussion
Greg - are you sure the minimum supported upload chunk size is 256 K?

I took the latest top-of-trunk sources to experiment further. I've
modified uploadFileAtPath: in the DocsSample by adding :

[service setServiceUploadChunkSize:1024*1024];

The upload of large PDF files continues to fail. In fact, it fails
with chunks as big as 5 MB. Note that such limit is way too big for 3G
mobile networks. The reason why we've originally set chunk size to 256
K is because from our fairly extensive experiments, it offered the
optimal upload reliability over 3G networks. 1 MB would be OK, but
larger chunks will definitely cause a problem.

Mainly I want to understand what is the desired server behavior in
this case and understand if the current behavior is considered a bug
which will be address soon or is by design (and thus requires our
application to be updated immediately).

Again - thank you for looking into it - I really appreciate your help.

-Chistoph

Greg Robbins

unread,
Nov 24, 2010, 8:33:08 PM11/24/10
to gdata-objec...@googlegroups.com
I think the problem is unrelated to chunk size, but merely crops up when chunks smaller than the full size are being sent.

The upload server team recently made a change which adds a Location header to all chunk responses. That header is confusing the Mac and iOS networking, which thinks the server is asking for a real redirect of the request.

I've alerted the upload server team to the issue, though unfortunately I don't know how long it will take to get a fix into production.

Here is a workaround that you can put into existing code. In GDataHTTPFetcher, in the method connection:willSendRequest:redirectResponse:, change the first few lines like this:

- (NSURLRequest *)connection:(NSURLConnection *)connection
             willSendRequest:(NSURLRequest *)redirectRequest
            redirectResponse:(NSURLResponse *)redirectResponse {
  if (redirectRequest && redirectResponse) {
    // add this:
    if ([[request_ URL] isEqual:[redirectRequest URL]]
        && [(NSHTTPURLResponse *)redirectResponse statusCode] == 308) {
      return nil;
    }

That's just adding an if statement that checks for the false redirect, and if found, immediately returning nil to tell NSURLConnection that it's not really a redirect that should be followed.

Christoph Z.

unread,
Nov 24, 2010, 8:48:15 PM11/24/10
to Google Data APIs Objective-C Client Library Discussion
Great catch - indeed this is it.

We will submit an update of our app tonight just in case the server
fix takes longer than two weeks. I realize that with holidays
tomorrow, it might take few days. Of course - it would be ideal to
revert the server changes until the issues are resolved.

Thanks again for your help and Happy Thanksgiving!

-Christohp

Greg Robbins

unread,
Nov 24, 2010, 8:50:36 PM11/24/10
to gdata-objec...@googlegroups.com
The server team tells me they're rolling back the change now, so hopefully it will be fixed for all users shortly.

Christoph Z.

unread,
Nov 24, 2010, 8:56:24 PM11/24/10
to Google Data APIs Objective-C Client Library Discussion
Phew - you guys rock!

In parallel - do you think I should submit the fix to increase upload
chunk size from 256 KB to 1 MB? Just want to make sure that our app
continues to work with the ultimate fix / server behavior.

Thanks,
Christoph

Greg Robbins

unread,
Nov 24, 2010, 9:00:45 PM11/24/10
to gdata-objec...@googlegroups.com
Larger chunk sizes are better; the server prefers them, and minimizing the number of chunks reduces http overhead. From the server's perspective, a 100 MB or bigger chunk is fine.

The only reason to use smaller chunk sizes are to avoid OS-specific issues, like iPhone 2's lack of upload progress callbacks. But I've not done any serious testing of OS-specific side effects of chunk sizes to optimize them.

Clearly, when an entire file can be successfully uploaded in a single chunk, the whole protocol is more reliable.

Christoph Z.

unread,
Nov 28, 2010, 9:07:12 PM11/28/10
to Google Data APIs Objective-C Client Library Discussion
Thanks for reverting the server change. Everything is back to normal.

Question regarding the workaround for redirect response with status
308 that you mentioned in the previous post. Obviously today it is no
longer needed, but what's the plan going forward? Are you guys
planning to resubmit the original server change and fix the client
library to handle the 308 status code? Are you planning to update the
obj-c client library to handle this case?

Just want to make sure we are well prepared for possible breaking
changes.

Thanks,
Christoph

Greg Robbins

unread,
Nov 30, 2010, 4:17:14 PM11/30/10
to gdata-objec...@googlegroups.com
The upload server team is reevaluating the protocol, since there's a more fundamental problem to be resolved to avoid the redirect loop. Don't bother trying to work around this issue; just keep using the client library. The server change will not be resubmitted.

Reply all
Reply to author
Forward
0 new messages