Attempt to fix gray avatars on mobile networks.

Ported from
e879862791
This commit is contained in:
Aleric Inglewood
2014-06-16 21:02:27 +02:00
parent 53b8f70de8
commit 589035c1db
3 changed files with 17 additions and 2 deletions

View File

@@ -243,7 +243,9 @@ bool LLHTTPClient::getByteRange(std::string const& url, AIHTTPHeaders& headers,
{ {
if (offset > 0 || bytes > 0) if (offset > 0 || bytes > 0)
{ {
headers.addHeader("Range", llformat("bytes=%d-%d", offset, offset + bytes - 1)); int const range_end = offset + bytes - 1;
char const* const range_format = (range_end >= HTTP_REQUESTS_RANGE_END_MAX) ? "bytes=%d-" : "bytes=%d-%d";
headers.addHeader("Range", llformat(range_format, offset, range_end));
} }
request(url, HTTP_GET, NULL, responder, headers, NULL/*,*/ DEBUG_CURLIO_PARAM(debug)); request(url, HTTP_GET, NULL, responder, headers, NULL/*,*/ DEBUG_CURLIO_PARAM(debug));
} }

View File

@@ -55,6 +55,17 @@ typedef struct _xmlrpc_request* XMLRPC_REQUEST;
typedef struct _xmlrpc_value* XMLRPC_VALUE; typedef struct _xmlrpc_value* XMLRPC_VALUE;
extern AIEngine gMainThreadEngine; extern AIEngine gMainThreadEngine;
// In Viewer 3 this definition is in indra/newview/lltexturefetch.cpp,
// but we need it in two .cpp files, so it's moved here.
//
// BUG-3323/SH-4375
// *NOTE: This is a heuristic value. Texture fetches have a habit of using a
// value of 32MB to indicate 'get the rest of the image'. Certain ISPs and
// network equipment get confused when they see this in a Range: header. So,
// if the request end is beyond this value, we issue an open-ended Range:
// request (e.g. 'Range: <start>-') which seems to fix the problem.
static const S32 HTTP_REQUESTS_RANGE_END_MAX = 20000000;
// Output parameter of AICurlPrivate::CurlEasyRequest::getResult. // Output parameter of AICurlPrivate::CurlEasyRequest::getResult.
// Used in XMLRPCResponder. // Used in XMLRPCResponder.
struct AITransferInfo { struct AITransferInfo {

View File

@@ -1416,7 +1416,9 @@ bool LLTextureFetchWorker::doWork(S32 param)
// Call LLHTTPClient::request directly instead of LLHTTPClient::getByteRange, because we want to pass a NULL AIEngine. // Call LLHTTPClient::request directly instead of LLHTTPClient::getByteRange, because we want to pass a NULL AIEngine.
if (mRequestedOffset > 0 || mRequestedSize > 0) if (mRequestedOffset > 0 || mRequestedSize > 0)
{ {
headers.addHeader("Range", llformat("bytes=%d-%d", mRequestedOffset, mRequestedOffset + mRequestedSize - 1)); int const range_end = mRequestedOffset + mRequestedSize - 1;
char const* const range_format = (range_end >= HTTP_REQUESTS_RANGE_END_MAX) ? "bytes=%d-" : "bytes=%d-%d";
headers.addHeader("Range", llformat(range_format, mRequestedOffset, range_end));
} }
LLHTTPClient::request(mUrl, LLHTTPClient::HTTP_GET, NULL, LLHTTPClient::request(mUrl, LLHTTPClient::HTTP_GET, NULL,
new HTTPGetResponder(mFetcher, mID, LLTimer::getTotalTime(), mRequestedSize, mRequestedOffset), new HTTPGetResponder(mFetcher, mID, LLTimer::getTotalTime(), mRequestedSize, mRequestedOffset),