// we have to reply an eventual error code statelessly
if (!checkURIScheme(request))
{
// Let's return a 416 Unsupported URI scheme
Response response = messageFactory.createResponse(
Response.UNSUPPORTED_URI_SCHEME, request);
if (serverTransaction != null)
serverTransaction.sendResponse(response);
else
sipProvider.sendResponse(response);
return false;
}
if (!checkMaxForwards(request))
{
// Let's return a 483 too many hops
Response response = messageFactory.createResponse(
Response.TOO_MANY_HOPS, request);
if (serverTransaction != null)
serverTransaction.sendResponse(response);
else
sipProvider.sendResponse(response);
return false;
}
if (!checkLoopDetection(request))
{
// Let's return a 482 Loop detection
Response response = messageFactory.createResponse(
Response.LOOP_DETECTED, request);
if (serverTransaction != null)
serverTransaction.sendResponse(response);
else
sipProvider.sendResponse(response);
return false;
}
if (!checkProxyRequire(request))
{
// Let's return a 420 Bad Extension
Response response = messageFactory.createResponse(
Response.BAD_EXTENSION, request);
// We have to add a Unsupported header listing the Option tags
// that we don't support:
HeaderFactory headerFactory = proxy.getHeaderFactory();
ProxyRequireHeader prh = (ProxyRequireHeader) request
.getHeader(ProxyRequireHeader.NAME);
if (prh != null)
{
UnsupportedHeader unsupportedHeader = headerFactory
.createUnsupportedHeader(prh.getOptionTag());
response.setHeader(unsupportedHeader);
}
if (serverTransaction != null)
serverTransaction.sendResponse(response);
else
sipProvider.sendResponse(response);
return false;
}
// Let's add some more important basics checks:
// - From tag presence.
if (!checkFromTag(request))
{
// Let's return a 400 BAD_REQUEST
Response response = messageFactory.createResponse(
Response.BAD_REQUEST, request);
if (serverTransaction != null)
serverTransaction.sendResponse(response);
else
sipProvider.sendResponse(response);
return false;
}
// For Event notifications:
if (presenceServer)
{
String method = request.getMethod();
if (method.equals("SUBSCRIBE"))
{
// RFC 3265 3.1.1:
/*
* Subscribers MUST include exactly one "Event" header in
* SUBSCRIBE requests, indicating to which event or class of
* events they are subscribing.
*/
if (!checkEventHeader(request))
{
// Let's return a 400 BAD_REQUEST
Response response = messageFactory.createResponse(
Response.BAD_REQUEST, request);
if (serverTransaction != null)
serverTransaction.sendResponse(response);
else
sipProvider.sendResponse(response);