XBOX::VError VRemoteDebugPilot::SendContextToBrowser( std::map< OpaqueDebuggerContext,VContextDescriptor* >::iterator& inCtxIt) { XBOX::VString resp; XBOX::VString brkptsStr; VChromeDebugHandler::GetJSONBreakpoints(brkptsStr); resp = CVSTR("{\"method\":\"updateContext\",\"contextId\":\""); resp.AppendLong8((sLONG8)(*inCtxIt).first); resp += CVSTR("\",\"debugLineNb\":"); resp.AppendLong((*inCtxIt).second->fDebugInfos.fLineNb); resp += CVSTR(",\"debugFileName\":\""); resp += (*inCtxIt).second->fDebugInfos.fFileName; resp += CVSTR("\",\"debugReason\":\""); resp += (*inCtxIt).second->fDebugInfos.fReason; resp += CVSTR("\",\"debugComment\":\""); resp += (*inCtxIt).second->fDebugInfos.fComment; resp += CVSTR("\",\"sourceLine\":\""); resp += (*inCtxIt).second->fDebugInfos.fSourceLine; resp += CVSTR("\",\"id\":\""); resp += fClientId; resp += "\",\"breakpoints\":"; resp += brkptsStr; resp += CVSTR("}"); return SendToBrowser( resp ); }
void MakeHostString (const XBOX::VString& inHost, PortNumber inPort, XBOX::VString& outHostString) { outHostString.Clear(); if (!inHost.IsEmpty()) outHostString.AppendString (inHost); if (inPort != DEFAULT_LISTENING_PORT) { outHostString.AppendUniChar (CHAR_COLON); outHostString.AppendLong (inPort); } }
XBOX::VString VHTTPCookie::ToString (bool inAlwaysExpires) const { XBOX::VString result; if (!IsValid()) return result; result.AppendString (fName); result.AppendUniChar (CHAR_EQUALS_SIGN); if (0 == fVersion) { // Netscape cookie result.AppendString (fValue); if (!fDomain.IsEmpty()) { result.AppendCString ("; Domain="); result.AppendString (fDomain); } if (!fPath.IsEmpty()) { result.AppendCString ("; Path="); result.AppendString (fPath); } if (fMaxAge >= 0) { XBOX::VTime curTime; XBOX::VString timeString; XBOX::VTime::Now (curTime); curTime.AddSeconds (fMaxAge); _GetRFC1123DateString (curTime, timeString); result.AppendCString ("; Expires="); result.AppendString (timeString); } if (fSecure) { result.AppendCString ("; Secure"); } if (fHTTPOnly) { result.AppendCString ("; HttpOnly"); } } else { // RFC 2109 cookie result.AppendString (fValue); if (!fComment.IsEmpty()) { result.AppendCString ("; Comment=\""); result.AppendString (fComment); result.AppendUniChar (CHAR_QUOTATION_MARK); } if (!fDomain.IsEmpty()) { result.AppendCString ("; Domain="); result.AppendString (fDomain); } if (!fPath.IsEmpty()) { result.AppendCString ("; Path="); result.AppendString (fPath); } else { result.AppendCString ("; Path=/"); } if (fMaxAge >= 0) { result.AppendCString ("; Max-Age="); result.AppendLong (fMaxAge); /* For Internet Explorer 6, 7 & 8 which does not support 'max-age' */ if (inAlwaysExpires) { XBOX::VTime curTime; XBOX::VString timeString; XBOX::VTime::Now (curTime); curTime.AddSeconds (fMaxAge); _GetRFC1123DateString (curTime, timeString); result.AppendCString ("; Expires="); result.AppendString (timeString); } } if (fSecure) { result.AppendCString ("; Secure"); } if (fHTTPOnly) { result.AppendCString ("; HttpOnly"); } result.AppendCString ("; Version=1"); } return result; }
XBOX::VError VHTTPResponse::SendResponse() { XBOX::VError error = XBOX::VE_OK; if (fIsChunked) { // First send buffered data that was not already sent... if (XBOX::VE_OK == (error = _SendResponseBody())) { // Then send special ending line for chunked encoding error = _WriteChunkSize (0); } } else { XBOX::VString contentType; XBOX::VString contentEncoding; GetHeaders().GetContentType (contentType); if (GetHeaders().GetHeaderValue (HEADER_CONTENT_ENCODING, contentEncoding) && !contentEncoding.IsEmpty()) { if (HTTPProtocol::NegotiateEncodingMethod (contentEncoding) != COMPRESSION_UNKNOWN) fCanCompressBody = false; } if (HTTP_UNDEFINED == fResponseStatusCode) fResponseStatusCode = HTTP_OK; VVirtualHost *virtualHost = dynamic_cast<VVirtualHost *>(GetVirtualHost()); if (NULL != virtualHost) { // Compress HTTP Message body when applicable #if HTTP_SERVER_GLOBAL_SETTINGS bool compressionEnabled = fHTTPServer->GetSettings()->GetEnableCompression(); #else bool compressionEnabled = virtualHost->GetSettings()->GetEnableCompression(); #endif if (fCanCompressBody && compressionEnabled) { sLONG size = (sLONG)GetBody().GetSize(); #if HTTP_SERVER_GLOBAL_SETTINGS sLONG minThreshold = (fMinCompressionThreshold == -1) ? fHTTPServer->GetSettings()->GetCompressionMinThreshold() : fMinCompressionThreshold; sLONG maxThreshold = (fMaxCompressionThreshold == -1) ? fHTTPServer->GetSettings()->GetCompressionMaxThreshold() : fMaxCompressionThreshold; #else sLONG minThreshold = (fMinCompressionThreshold == -1) ? virtualHost->GetSettings()->GetCompressionMinThreshold() : fMinCompressionThreshold; sLONG maxThreshold = (fMaxCompressionThreshold == -1) ? virtualHost->GetSettings()->GetCompressionMaxThreshold() : fMaxCompressionThreshold; #endif if ((size > minThreshold) && (size <= maxThreshold)) { if (!contentType.IsEmpty() && (VMimeTypeManager::IsMimeTypeCompressible (contentType))) { error = _CompressData(); } } } } // Put HTTP Message body in cache when applicable if ((NULL != virtualHost) && fCanCacheBody && (fResponseStatusCode == HTTP_OK)) { #if HTTP_SERVER_GLOBAL_CACHE VCacheManager * cacheManager = virtualHost->GetProject()->GetHTTPServer()->GetCacheManager(); #else VCacheManager * cacheManager = virtualHost->GetCacheManager(); #endif XBOX::VFilePath filePath; XBOX::VString locationPath; XBOX::VTime lastModified; XBOX::VString lastModifiedString; XBOX::VError fileError = XBOX::VE_OK; bool staticFile = false; if (XBOX::VE_OK == (fileError = virtualHost->GetFilePathFromURL (fRequest->GetURL(), locationPath))) { filePath.FromFullPath (locationPath); if (filePath.IsFile() && (XBOX::VE_OK == HTTPServerTools::GetFileInfos (filePath, &lastModified))) { staticFile = true; HTTPProtocol::MakeRFC822GMTDateString (lastModified, lastModifiedString); } } if ((XBOX::VE_OK == fileError) && (NULL != cacheManager) && cacheManager->GetEnableDataCache()) { uLONG bufferSize = (uLONG)GetBody().GetSize(); if (bufferSize <= cacheManager->GetCachedObjectMaxSize()) { void * buffer = GetBody().GetDataPtr(); XBOX::VTime lastChecked; VCachedObject * cachedObject = NULL; XBOX::VTime::Now (lastChecked); bool ok = cacheManager->AddPageToCache (fRequest->GetURL(), virtualHost->GetUUIDString(), contentType, buffer, bufferSize, filePath, lastChecked, lastModified, staticFile, fCompressionMode, &cachedObject); if (ok) { if (NULL != cachedObject) { XBOX::VTime expirationDate; sLONG maxAge = cachedObject->GetMaxAge(); if (maxAge > 0) { XBOX::VString string; string.FromCString ("max-age="); string.AppendLong (maxAge); AddResponseHeader (STRING_HEADER_CACHE_CONTROL, string); AddResponseHeader (STRING_HEADER_AGE, cachedObject->GetAge()); if (cachedObject->GetExpirationDate (expirationDate)) AddResponseHeader (STRING_HEADER_EXPIRES, expirationDate); } else if (cachedObject->GetExpirationDate (expirationDate) && IsVTimeValid (expirationDate)) { AddResponseHeader (STRING_HEADER_EXPIRES, expirationDate); } XBOX::QuickReleaseRefCountable (cachedObject); } } } } if (!lastModifiedString.IsEmpty()) AddResponseHeader (STRING_HEADER_LAST_MODIFIED, lastModifiedString); } if (HTTP_OK == fResponseStatusCode) { if (NULL != fFileToSend) { if (fFileToSend->Exists()) { sLONG8 fileSize = 0; fFileToSend->GetSize (&fileSize); this->SetContentLengthHeader (fileSize); // YT 18-Jul-2011 - ACI0072287 if (XBOX::VE_OK == (error = _SendResponseHeader())) { const sLONG CHUNK_BUFFER_SIZE = 0xFFFF; char * chunkBuffer = (char *)XBOX::vMalloc (CHUNK_BUFFER_SIZE, 0); if (testAssert (NULL != chunkBuffer)) { XBOX::VFileDesc *fileDesc = NULL; if ((XBOX::VE_OK == fFileToSend->Open (XBOX::FA_READ, &fileDesc, XBOX::FO_SequentialScan)) && (NULL != fileDesc)) { uLONG chunkSize = 0; XBOX::VSize readBytes = 0; XBOX::VError fileError = XBOX::VE_OK; sLONG8 unreadSize = 0; unreadSize = fileSize; fileDesc->SetPos (0, true); while ((XBOX::VE_OK == fileError) && (unreadSize > 0)) { chunkSize = (unreadSize > CHUNK_BUFFER_SIZE) ? CHUNK_BUFFER_SIZE : unreadSize; fileError = fileDesc->GetDataAtPos (chunkBuffer, chunkSize, 0, &readBytes); unreadSize -= (sLONG8)readBytes; if ((XBOX::VE_OK == fileError) || (XBOX::VE_STREAM_EOF == fileError)) { error = _WriteToSocket (chunkBuffer, &chunkSize); if (XBOX::VE_OK != error) break; } } delete fileDesc; fileDesc = NULL; } else { error = _SendResponseWithStatusCode (HTTP_INTERNAL_SERVER_ERROR); } XBOX::vFree (chunkBuffer); chunkBuffer = NULL; } else { error = _SendResponseWithStatusCode (HTTP_INTERNAL_SERVER_ERROR); } } } else { error = _SendResponseWithStatusCode (HTTP_NOT_FOUND); } XBOX::ReleaseRefCountable (&fFileToSend); } else if (GetBody().GetDataSize() >= 0) { if (XBOX::VE_OK == (error = _SendResponseHeader())) { if (NULL != GetBody().GetDataPtr()) error = _SendResponseBody(); } } else { error = _SendResponseWithStatusCode (HTTP_INTERNAL_SERVER_ERROR); } } else { error = _SendResponseWithStatusCode (fResponseStatusCode); } } return error; }