📄 dialogusagemanager.cxx
字号:
it = mIncomingFeatureChainMap.insert(lb, FeatureChainMap::value_type(tid, new DumFeatureChain(*this, mIncomingFeatureList, *mIncomingTarget))); } } DumFeatureChain::ProcessingResult res = it->second->process(msg.get()); if (res & DumFeatureChain::ChainDoneBit) { delete it->second; mIncomingFeatureChainMap.erase(it); //DebugLog(<< "feature chain deleted" << endl); } if (res & DumFeatureChain::EventTakenBit) { msg.release(); //DebugLog(<< "event taken"); return; } } try { InfoLog (<< "Got: " << msg->brief()); DumDecrypted* decryptedMsg = dynamic_cast<DumDecrypted*>(msg.get()); SipMessage* sipMsg = 0; if (decryptedMsg) { sipMsg = decryptedMsg->decrypted(); } else { sipMsg = dynamic_cast<SipMessage*>(msg.get()); } if (sipMsg) { //DebugLog ( << "DialogUsageManager::process: " << sipMsg->brief()); if (sipMsg->isRequest()) { // Validate Request URI if( !validateRequestURI(*sipMsg) ) { DebugLog (<< "Failed RequestURI validation " << *sipMsg); return; } // Continue validation on all requests, except ACK and CANCEL if(sipMsg->header(h_RequestLine).method() != ACK && sipMsg->header(h_RequestLine).method() != CANCEL) { if( !validateRequiredOptions(*sipMsg) ) { DebugLog (<< "Failed required options validation " << *sipMsg); return; } if( !validate100RelSuport(*sipMsg) ) { DebugLog (<< "Remote party does not suport 100rel " << *sipMsg); return; } if( getMasterProfile()->validateContentEnabled() && !validateContent(*sipMsg) ) { DebugLog (<< "Failed content validation " << *sipMsg); return; } if( getMasterProfile()->validateAcceptEnabled() && !validateAccept(*sipMsg) ) { DebugLog (<< "Failed accept validation " << *sipMsg); return; } } if (sipMsg->header(h_From).exists(p_tag)) { if (mergeRequest(*sipMsg) ) { InfoLog (<< "Merged request: " << *sipMsg); return; } } processRequest(*sipMsg); } else { processResponse(*sipMsg); } } } catch(BaseException& e) { //unparseable, bad 403 w/ 2543 trans it from FWD, etc ErrLog(<<"Illegal message rejected: " << e.getMessage()); }}bool DialogUsageManager::hasEvents() const{ return mFifo.messageAvailable();}// return true if there is more to dobool DialogUsageManager::process(resip::RWMutex* mutex){ if (mFifo.messageAvailable()) { if (mutex) { resip::Lock lock(*mutex); internalProcess(std::auto_ptr<Message>(mFifo.getNext())); } else { internalProcess(std::auto_ptr<Message>(mFifo.getNext())); } } return mFifo.messageAvailable();}bool DialogUsageManager::process(int timeoutMs, resip::RWMutex* mutex){ std::auto_ptr<Message> message; if(timeoutMs == -1) { message.reset(mFifo.getNext()); } else { message.reset(mFifo.getNext(timeoutMs)); } if (message.get()) { if (mutex) { resip::Lock lock(*mutex); internalProcess(message); } else { internalProcess(message); } } return mFifo.messageAvailable();}boolDialogUsageManager::validateRequestURI(const SipMessage& request){ // RFC3261 - 8.2.1 if (!getMasterProfile()->isMethodSupported(request.header(h_RequestLine).getMethod())) { InfoLog (<< "Received an unsupported method: " << request.brief()); SipMessage failure; makeResponse(failure, request, 405); failure.header(h_Allows) = getMasterProfile()->getAllowedMethods(); sendResponse(failure); return false; } // RFC3261 - 8.2.2 if (!getMasterProfile()->isSchemeSupported(request.header(h_RequestLine).uri().scheme())) { InfoLog (<< "Received an unsupported scheme: " << request.brief()); SipMessage failure; makeResponse(failure, request, 416); sendResponse(failure); return false; } return true;}boolDialogUsageManager::validateRequiredOptions(const SipMessage& request){ // RFC 2162 - 8.2.2 if(request.exists(h_Requires) && // Don't check requires if method is ACK or CANCEL (request.header(h_RequestLine).getMethod() != ACK || request.header(h_RequestLine).getMethod() != CANCEL)) { Tokens unsupported = getMasterProfile()->getUnsupportedOptionsTags(request.header(h_Requires)); if (!unsupported.empty()) { InfoLog (<< "Received an unsupported option tag(s): " << request.brief()); SipMessage failure; makeResponse(failure, request, 420); failure.header(h_Unsupporteds) = unsupported; sendResponse(failure); return false; } } return true;}boolDialogUsageManager::validate100RelSuport(const SipMessage& request){ if(request.header(h_RequestLine).getMethod() == INVITE) { if (getMasterProfile()->getUasReliableProvisionalMode() == MasterProfile::Required) { if (!(request.exists(h_Requires) && request.header(h_Requires).find(Token(Symbols::C100rel)) || request.exists(h_Supporteds) && request.header(h_Supporteds).find(Token(Symbols::C100rel)))) { SipMessage failure; makeResponse(failure, request, 421); failure.header(h_Requires).push_back(Token(Symbols::C100rel)); sendResponse(failure); return false; } } } return true;}boolDialogUsageManager::validateContent(const SipMessage& request){ // RFC3261 - 8.2.3 // Don't need to validate content headers if they are specified as optional in the content-disposition if (!(request.exists(h_ContentDisposition) && request.header(h_ContentDisposition).isWellFormed() && request.header(h_ContentDisposition).exists(p_handling) && isEqualNoCase(request.header(h_ContentDisposition).param(p_handling), Symbols::Optional))) { if (request.exists(h_ContentType) && !getMasterProfile()->isMimeTypeSupported(request.header(h_RequestLine).method(), request.header(h_ContentType))) { InfoLog (<< "Received an unsupported mime type: " << request.header(h_ContentType) << " for " << request.brief()); SipMessage failure; makeResponse(failure, request, 415); failure.header(h_Accepts) = getMasterProfile()->getSupportedMimeTypes(request.header(h_RequestLine).method()); sendResponse(failure); return false; } if (request.exists(h_ContentEncoding) && !getMasterProfile()->isContentEncodingSupported(request.header(h_ContentEncoding))) { InfoLog (<< "Received an unsupported mime type: " << request.header(h_ContentEncoding) << " for " << request.brief()); SipMessage failure; makeResponse(failure, request, 415); failure.header(h_AcceptEncodings) = getMasterProfile()->getSupportedEncodings(); sendResponse(failure); return false; } if (getMasterProfile()->validateContentLanguageEnabled() && request.exists(h_ContentLanguages) && !getMasterProfile()->isLanguageSupported(request.header(h_ContentLanguages))) { InfoLog (<< "Received an unsupported language: " << request.header(h_ContentLanguages).front() << " for " << request.brief()); SipMessage failure; makeResponse(failure, request, 415); failure.header(h_AcceptLanguages) = getMasterProfile()->getSupportedLanguages(); sendResponse(failure); return false; } } return true;}boolDialogUsageManager::validateAccept(const SipMessage& request){ MethodTypes method = request.header(h_RequestLine).method(); // checks for Accept to comply with SFTF test case 216 if(request.exists(h_Accepts)) { for (Mimes::const_iterator i = request.header(h_Accepts).begin(); i != request.header(h_Accepts).end(); i++) { if (getMasterProfile()->isMimeTypeSupported(method, *i)) { return true; // Accept header passes validation if we support as least one of the mime types } } } // If no Accept header then application/sdp should be assumed for certain methods else if(method == INVITE || method == OPTIONS || method == PRACK || method == UPDATE) { if (getMasterProfile()->isMimeTypeSupported(request.header(h_RequestLine).method(), Mime("application", "sdp"))) { return true; } } else { // Other method without an Accept Header return true; } InfoLog (<< "Received unsupported mime types in accept header: " << request.brief()); SipMessage failure; makeResponse(failure, request, 406); failure.header(h_Accepts) = getMasterProfile()->getSupportedMimeTypes(method); sendResponse(failure); return false;}boolDialogUsageManager::mergeRequest(const SipMessage& request){ assert(request.isRequest()); assert(request.isExternal()); if (!request.header(h_To).exists(p_tag)) { if (mMergedRequests.count(MergedRequestKey(request, getMasterProfile()->checkReqUriInMergeDetectionEnabled()))) { SipMessage failure; makeResponse(failure, request, 482, "Merged Request"); failure.header(h_AcceptLanguages) = getMasterProfile()->getSupportedLanguages(); sendResponse(failure); return true; } } return false;}voidDialogUsageManager::processRequest(const SipMessage& request){ DebugLog ( << "DialogUsageManager::processRequest: " << request.brief()); if (mShutdownState != Running && mShutdownState != ShutdownRequested) { WarningLog (<< "Ignoring a request since we are shutting down " << request.brief()); SipMessage failure; makeResponse(failure, request, 480, "UAS is shutting down"); sendResponse(failure); return; } if (request.header(h_RequestLine).method() == PUBLISH) { processPublish(request); return; } bool toTag = request.header(h_To).exists(p_tag); if(request.header(h_RequestLine).getMethod() == REGISTER && toTag && getMasterProfile()->allowBadRegistrationEnabled()) { toTag = false; } assert(mAppDialogSetFactory.get()); // !jf! note, the logic was reversed during ye great merge of March of Ought 5 if (toTag || findDialogSet(DialogSetId(request))) { switch (request.header(h_RequestLine).getMethod()) { case REGISTER: { SipMessage failure; makeResponse(failure, request, 400, "Registration requests can't have To: tags."); failure.header(h_AcceptLanguages) = getMasterProfile()->getSupportedLanguages(); sendResponse(failure); break; } default: { DialogSet* ds = findDialogSet(DialogSetId(request)); if (ds == 0) { if (request.header(h_RequestLine).method() != ACK) { SipMessage failure; makeResponse(failure, request, 481); failure.header(h_AcceptLanguages) = getMasterProfile()->getSupportedLanguages(); InfoLog (<< "Rejected request (which was in a dialog) " << request.brief()); sendResponse(failure); } else { InfoLog (<< "ACK doesn't match any dialog" << request.brief()); } } else { InfoLog (<< "Handling in-dialog request: " << request.brief()); ds->dispatch(request); } } } } else { switch (request.header(h_RequestLine).getMethod()) { case ACK: DebugLog (<< "Discarding request: " << request.brief()); break; case PRACK: case BYE: case UPDATE: case INFO: // !rm! in an ideal world { SipMessage failure; makeResponse(failure, request, 481); failure.header(h_AcceptLanguages) = getMasterProfile()->getSupportedLanguages(); sendResponse(failure); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -