MSPL Script Sample as Message Filter (Lync Server 2013 Preview SDK)
In Microsoft Lync Server 2013 SDK, use this MSPL script to filter incoming SIP responses and select a message endpoint.
Applies to: Lync 2013 | Lync Server 2013
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 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
If the following RequestUri pattern 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
Concepts
Microsoft SIP Processing language Script (Lync Server 2013 Preview SDK)
Feedback
https://aka.ms/ContentUserFeedback.
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:Submit and view feedback for