179 lines
6.9 KiB
C++
179 lines
6.9 KiB
C++
/*
|
|
*
|
|
* @APPLE_LICENSE_HEADER_START@
|
|
*
|
|
* Copyright (c) 1999-2008 Apple Inc. All Rights Reserved.
|
|
*
|
|
* This file contains Original Code and/or Modifications of Original Code
|
|
* as defined in and that are subject to the Apple Public Source License
|
|
* Version 2.0 (the 'License'). You may not use this file except in
|
|
* compliance with the License. Please obtain a copy of the License at
|
|
* http://www.opensource.apple.com/apsl/ and read it before using this
|
|
* file.
|
|
*
|
|
* The Original Code and all software distributed under the License are
|
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
|
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
|
|
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
|
* Please see the License for the specific language governing rights and
|
|
* limitations under the License.
|
|
*
|
|
* @APPLE_LICENSE_HEADER_END@
|
|
*
|
|
*/
|
|
/*
|
|
File: RTSPSession.h
|
|
|
|
Contains: Represents an RTSP session (duh), which I define as a complete TCP connection
|
|
lifetime, from connection to FIN or RESET termination. This object is
|
|
the active element that gets scheduled and gets work done. It creates requests
|
|
and processes them when data arrives. When it is time to close the connection
|
|
it takes care of that.
|
|
|
|
*/
|
|
|
|
#ifndef __RTSPSESSION_H__
|
|
#define __RTSPSESSION_H__
|
|
|
|
#include "RTSPSessionInterface.h"
|
|
#include "RTSPRequestStream.h"
|
|
#include "RTSPRequest.h"
|
|
#include "RTPSession.h"
|
|
#include "TimeoutTask.h"
|
|
|
|
class RTSPSession : public RTSPSessionInterface
|
|
{
|
|
public:
|
|
|
|
RTSPSession(Bool16 doReportHTTPConnectionAddress);
|
|
virtual ~RTSPSession();
|
|
|
|
// Call this before using this object
|
|
static void Initialize();
|
|
|
|
Bool16 IsPlaying() {if (fRTPSession == NULL) return false; if (fRTPSession->GetSessionState() == qtssPlayingState) return true; return false; }
|
|
|
|
|
|
private:
|
|
|
|
SInt64 Run();
|
|
|
|
// Gets & creates RTP session for this request.
|
|
QTSS_Error FindRTPSession(OSRefTable* inTable);
|
|
QTSS_Error CreateNewRTPSession(OSRefTable* inTable);
|
|
void SetupClientSessionAttrs();
|
|
|
|
// Does request prep & request cleanup, respectively
|
|
void SetupRequest();
|
|
void CleanupRequest();
|
|
|
|
Bool16 ParseOptionsResponse();
|
|
|
|
// Fancy random number generator
|
|
UInt32 GenerateNewSessionID(char* ioBuffer);
|
|
|
|
// Sends an error response & returns error if not ok.
|
|
QTSS_Error IsOkToAddNewRTPSession();
|
|
|
|
// Checks authentication parameters
|
|
void CheckAuthentication();
|
|
|
|
// test current connections handled by this object against server pref connection limit
|
|
Bool16 OverMaxConnections(UInt32 buffer);
|
|
|
|
// Process the 3GPP Request Data for the session
|
|
void Process3GPPData();
|
|
|
|
char fLastRTPSessionID[QTSS_MAX_SESSION_ID_LENGTH];
|
|
StrPtrLen fLastRTPSessionIDPtr;
|
|
|
|
RTSPRequest* fRequest;
|
|
RTPSession* fRTPSession;
|
|
|
|
|
|
/* -- begin adds for HTTP ProxyTunnel -- */
|
|
|
|
// This gets grabbed whenever the input side of the session is being used.
|
|
// It is to protect POST snarfage while input stuff is in action
|
|
OSMutex fReadMutex;
|
|
|
|
OSRef* RegisterRTSPSessionIntoHTTPProxyTunnelMap(QTSS_RTSPSessionType inSessionType);
|
|
QTSS_Error PreFilterForHTTPProxyTunnel(); // prefilter for HTTP proxies
|
|
Bool16 ParseProxyTunnelHTTP(); // use by PreFilterForHTTPProxyTunnel
|
|
void HandleIncomingDataPacket();
|
|
|
|
static OSRefTable* sHTTPProxyTunnelMap; // a map of available partners.
|
|
|
|
enum
|
|
{
|
|
kMaxHTTPResponseLen = 512
|
|
};
|
|
static char sHTTPResponseHeaderBuf[kMaxHTTPResponseLen];
|
|
static StrPtrLen sHTTPResponseHeaderPtr;
|
|
|
|
static char sHTTPResponseNoServerHeaderBuf[kMaxHTTPResponseLen];
|
|
static StrPtrLen sHTTPResponseNoServerHeaderPtr;
|
|
|
|
static char *sHTTPResponseFormatStr;
|
|
static char *sHTTPNoServerResponseFormatStr;
|
|
char fProxySessionID[QTSS_MAX_SESSION_ID_LENGTH]; // our magic cookie to match proxy connections
|
|
StrPtrLen fProxySessionIDPtr;
|
|
OSRef fProxyRef;
|
|
enum
|
|
{
|
|
// the kinds of HTTP Methods we're interested in for
|
|
// RTSP tunneling
|
|
kHTTPMethodInit // initialize to this
|
|
, kHTTPMethodUnknown // tested, but unknown
|
|
, kHTTPMethodGet // found one of these methods...
|
|
, kHTTPMethodPost
|
|
};
|
|
|
|
UInt16 fHTTPMethod;
|
|
Bool16 fWasHTTPRequest;
|
|
Bool16 fFoundValidAccept;
|
|
Bool16 fDoReportHTTPConnectionAddress; // true if we need to report our IP adress in reponse to the clients GET request (necessary for servers behind DNS round robin)
|
|
/* -- end adds for HTTP ProxyTunnel -- */
|
|
|
|
|
|
// Module invocation and module state.
|
|
// This info keeps track of our current state so that
|
|
// the state machine works properly.
|
|
enum
|
|
{
|
|
kReadingRequest = 0,
|
|
kFilteringRequest = 1,
|
|
kRoutingRequest = 2,
|
|
kAuthenticatingRequest = 3,
|
|
kAuthorizingRequest = 4,
|
|
kPreprocessingRequest = 5,
|
|
kProcessingRequest = 6,
|
|
kSendingResponse = 7,
|
|
kPostProcessingRequest = 8,
|
|
kCleaningUp = 9,
|
|
|
|
// states that RTSP sessions that setup RTSP
|
|
// through HTTP tunnels pass through
|
|
kWaitingToBindHTTPTunnel = 10, // POST or GET side waiting to be joined with it's matching half
|
|
kSocketHasBeenBoundIntoHTTPTunnel = 11, // POST side after attachment by GET side ( its dying )
|
|
kHTTPFilteringRequest = 12, // after kReadingRequest, enter this state
|
|
kReadingFirstRequest = 13, // initial state - the only time we look for an HTTP tunnel
|
|
kHaveNonTunnelMessage = 14 // we've looked at the message, and its not an HTTP tunnle message
|
|
};
|
|
|
|
UInt32 fCurrentModule;
|
|
UInt32 fState;
|
|
|
|
QTSS_RoleParams fRoleParams;//module param blocks for roles.
|
|
QTSS_ModuleState fModuleState;
|
|
|
|
QTSS_Error SetupAuthLocalPath(RTSPRequest *theRTSPRequest);
|
|
|
|
|
|
void SaveRequestAuthorizationParams(RTSPRequest *theRTSPRequest);
|
|
QTSS_Error DumpRequestData();
|
|
|
|
};
|
|
#endif // __RTSPSESSION_H__
|
|
|