void RTSPRequestInterface::Initialize() { //make a partially complete header StringFormatter headerFormatter(sPremadeHeaderPtr.Ptr, kStaticHeaderSizeInBytes); PutStatusLine(&headerFormatter, qtssSuccessOK, RTSPProtocol::k10Version); headerFormatter.Put(QTSServerInterface::GetServerHeader()); headerFormatter.PutEOL(); headerFormatter.Put(RTSPProtocol::GetHeaderString(qtssCSeqHeader)); headerFormatter.Put(sColonSpace); sPremadeHeaderPtr.Len = headerFormatter.GetCurrentOffset(); Assert(sPremadeHeaderPtr.Len < kStaticHeaderSizeInBytes); StringFormatter noServerInfoHeaderFormatter(sPremadeNoHeaderPtr.Ptr, kStaticHeaderSizeInBytes); PutStatusLine(&noServerInfoHeaderFormatter, qtssSuccessOK, RTSPProtocol::k10Version); noServerInfoHeaderFormatter.Put(RTSPProtocol::GetHeaderString(qtssCSeqHeader)); noServerInfoHeaderFormatter.Put(sColonSpace); sPremadeNoHeaderPtr.Len = noServerInfoHeaderFormatter.GetCurrentOffset(); Assert(sPremadeNoHeaderPtr.Len < kStaticHeaderSizeInBytes); //Setup all the dictionary stuff for (UInt32 x = 0; x < qtssRTSPReqNumParams; x++) QTSSDictionaryMap::GetMap(QTSSDictionaryMap::kRTSPRequestDictIndex)-> SetAttribute(x, sAttributes[x].fAttrName, sAttributes[x].fFuncPtr, sAttributes[x].fAttrDataType, sAttributes[x].fAttrPermission); QTSSDictionaryMap* theHeaderMap = QTSSDictionaryMap::GetMap(QTSSDictionaryMap::kRTSPHeaderDictIndex); for (UInt32 y = 0; y < qtssNumHeaders; y++) theHeaderMap->SetAttribute(y, RTSPProtocol::GetHeaderString(y).Ptr, NULL, qtssAttrDataTypeCharArray, qtssAttrModeRead | qtssAttrModePreempSafe); }
void HTTPRequest:: CreateResponseHeader(HTTPStatusCode statusCode, HTTPVersion version) { // If we are creating a second response for the same request, make sure and // deallocate memory for old response and allocate fresh memory if (fResponseFormatter != NULL) { if(fResponseHeader->Ptr != NULL) delete fResponseHeader->Ptr; delete fResponseHeader; delete fResponseFormatter; } // Allocate memory for the response when you first create it char* responseString = NEW char[kMinHeaderSizeInBytes]; fResponseHeader = NEW StrPtrLen(responseString, kMinHeaderSizeInBytes); fResponseFormatter = NEW ResizeableStringFormatter(fResponseHeader->Ptr, fResponseHeader->Len); //make a partial header for the given version and status code PutStatusLine(fResponseFormatter, statusCode, version); Assert(fSvrHeader.Ptr != NULL); //fResponseFormatter->Put(fSvrHeader); //fResponseFormatter->PutEOL(); //AppendResponseHeader(httpServerHeader,&fSvrHeader); fResponseHeader->Len = fResponseFormatter->GetCurrentOffset(); }
void RTSPRequestInterface::WriteStandardHeaders() { static StrPtrLen sCloseString("Close", 5); Assert(sPremadeHeader != NULL); fStandardHeadersWritten = true; //must be done here to prevent recursive calls //if this is a "200 OK" response (most HTTP responses), we have some special //optmizations here Bool16 sendServerInfo = QTSServerInterface::GetServer()->GetPrefs()->GetRTSPServerInfoEnabled(); if (fStatus == qtssSuccessOK) { if (sendServerInfo) { fOutputStream->Put(sPremadeHeaderPtr); } else { fOutputStream->Put(sPremadeNoHeaderPtr); } StrPtrLen* cSeq = fHeaderDictionary.GetValue(qtssCSeqHeader); Assert(cSeq != NULL); if (cSeq->Len > 1) fOutputStream->Put(*cSeq); else if (cSeq->Len == 1) fOutputStream->PutChar(*cSeq->Ptr); fOutputStream->PutEOL(); } else { #if 0 // if you want the connection to stay alive when we don't grok // the specfied parameter than eneable this code. - [sfu] if (fStatus == qtssClientParameterNotUnderstood) { fResponseKeepAlive = true; } #endif //other status codes just get built on the fly PutStatusLine(fOutputStream, fStatus, RTSPProtocol::k10Version); if (sendServerInfo) { fOutputStream->Put(QTSServerInterface::GetServerHeader()); fOutputStream->PutEOL(); } AppendHeader(qtssCSeqHeader, fHeaderDictionary.GetValue(qtssCSeqHeader)); } //append sessionID header StrPtrLen* incomingID = fHeaderDictionary.GetValue(qtssSessionHeader); if ((incomingID != NULL) && (incomingID->Len > 0)) AppendHeader(qtssSessionHeader, incomingID); //follows the HTTP/1.1 convention: if server wants to close the connection, it //tags the response with the Connection: close header if (!fResponseKeepAlive) AppendHeader(qtssConnectionHeader, &sCloseString); }