In Microsoft Lync Server 2013 SDK, use this MSPL script to filter incoming SIP responses and select a message endpoint.

Filter incoming SIP responses

This Microsoft SIP Processing Language (MSPL) script example filters incoming SIP responses and attempts to select the best endpoint for each message based on the endpoint ID (EPID).

XML  Copy codeCopy code
<?xml version="1.0">
<lc:applicationManifest
 lc:appUri="http://www.contoso.com/DefaultRoutingScript"
 xmlns:lc="http://schemas.microsoft.com/lcs/2006/05">
<lc:requestFilter
methodNames="INVITE,MESSAGE,INFO,REFER,ACK,BYE,OTHER"
						strictRoute="false"
						registrarGenerated="true"
						domainSupported="true"/ >
<lc:responseFilter reasonCodes="NONE" />
<lc:proxyByDefault action="true" />
<lc:scriptOnly />
<lc:splScript><![CDATA[
	//
	// This script handles default routing of requests to Lync
Server.  It
	// looks up all the registered endpoints for the To: user@host
and tries
	// to pick the best endpoint to route based on:
	//  EPID
	//
	// Endpoints with no presence or an availability less than 100,
or
	// no routing information (for example, set presence without
	// register) are not considered.
	//

	Log( "Debugr", 1, "we have a request - ", sipRequest.Method );

	//
	// Build the user@host from the To: header.
	//
	toUri = GetUri( sipRequest.To );
	toUserAtHost = Concatenate( GetUserName( toUri ), "@",
GetHostName( toUri ) );

	//
	// Determine whether this request is already asking for a
specific EPID
	// through a parameter in the To: header.
	//
	requestEPID = GetParameterValue( sipRequest.To, "EPID" );

	//
	// Now loop over all the endpoints for the To: user@host.
	//
	bestEPID = "";
	bestAgeOfPresence = 0x7FFFFFFF;
	bestAvailability = 0;
	bestActivity = 0;
	bestContactInfo = "";
	Log( "Debugr", 1, "EPID - ", requestEPID );
	Log( "Debugr", 1, "toUserAtHost - ", toUserAtHost );
	foreach (dbEndpoint in QueryEndpoints( toUserAtHost, true )) {
		Log( "Debugr", 1, "	endpoint.EPID - ", dbEndpoint.EPID
);
		Log( "Debugr", 1, "	endpoint.ContactInfo - ",
dbEndpoint.ContactInfo );

		//
		// First, determine whether this endpoint supports the
method in the request.
		//
		if (!SupportsMethod( sipRequest.Method,
dbEndpoint.StandardMethods, dbEndpoint.ExtraMethods )) {
			//
			// Skip this endpoint because it cannot handle the
method on this request.
			//
			Log( "Debugr", 1, "		* skipped because of method"
);
			continue;
		}

		if (requestEPID != "") {
			if (requestEPID == dbEndpoint.EPID) {
				//
				// The request is already targeted at a specific
EPID that can handle the method,
				// so use this endpoint.
				//
				Log( "Debugr", 1, "		* matched EPID" );
				bestContactInfo = dbEndpoint.ContactInfo;
				break;
		}
			else {
				//
				// The request is targeted at a specific EPID, but
does not match this endpoint.
				// Skip this endpoint.
				//
				Log( "Debugr", 1, "		* skipped because of
EPID" );
				continue;
		}
	}

		bestEPID = dbEndpoint.EPID;
		bestContactInfo = dbEndpoint.ContactInfo;
		Log( "Debugr", 1, "		*** new best contact" );
	}

	//
	// See if an endpoint to proxy to was found.
	//
	if (bestContactInfo == "") {
		/* Uncomment this block of code and the two previous
assignments to sawAtLeastOneEndpoint
		 if you want to run a UAC application before this one and
have this code
		 route your messages to the correct home server.
		if (!sawAtLeastOneEndpoint) {
			homeServer = QueryHomeServer( toUserAtHost );
			if (!EqualString( homeServer, FQDN, true )) {
				Log( "Debugr", 1, toUserAtHost, " is homed on ",
homeServer );
				newRequestUri = Concatenate( sipRequest.RequestUri,
";maddr=", homeServer );
				Log( "Debugr", 1, "Request is being routed to ",
newRequestUri );
				AddHeader( "MS-LBVIA", FQDN );
				ProxyRequest( newRequestUri );
				return;
		}
	}
		*/
		Log( "Debugr", 1, "Responding 480 - temporarily unavailable
as no suitable endpoint found" );
		Respond( 480, "Temporarily Unavailable" );
}
	else {
		if (requestEPID == "") {
			Log( "Debugr", 1, "Adding missing EPID '", bestEPID, "'
to To header" );
			SetParameterValue( "To", "epid", bestEPID );
		}

		Log( "Debugr", 1, "Proxying request to - ", bestContactInfo
);
		ProxyRequest( bestContactInfo );
	}

	return;
]]></lc:splScript>
</lc:applicationManifest>
Note Note

If the following RequestUripattern is used, the request is marked as routed without providing a request target. Applications that do not have routing information for a request should not modify request-uri.

request.RequestUri = ...

ProxyRequest(sipRequestUri)

See also