Skip to content

Commit

Permalink
Merge branch 'master' into github2808
Browse files Browse the repository at this point in the history
  • Loading branch information
jaimecasero committed Feb 20, 2018
2 parents d4a24f7 + f9a30f2 commit 7589e41
Show file tree
Hide file tree
Showing 4 changed files with 153 additions and 143 deletions.
Expand Up @@ -18,12 +18,14 @@
*
*/package org.restcomm.connect.telephony.api.util;

import java.io.IOException;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.InetAddress;
import java.net.URI;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Currency;
import java.util.Map;
import java.util.Vector;

import javax.sdp.Connection;
Expand Down Expand Up @@ -70,6 +72,7 @@ public class B2BUAHelper {
public static final String B2BUA_LAST_REQUEST = "lastRequest";
public static final String B2BUA_LAST_RESPONSE = "lastResponse";
public static final String B2BUA_LAST_FINAL_RESPONSE = "lastFinalResponse";
public static final String EXTENSION_HEADERS = "extensionHeaders";
private static final String B2BUA_LINKED_SESSION = "linkedSession";
private static final String CDR_SID = "callDetailRecord_sid";

Expand Down Expand Up @@ -302,6 +305,9 @@ public static boolean redirectToB2BUA(final SipServletRequest request, final Cli
((SipSessionExt) outRequest.getSession()).setBypassProxy(true);
}
}

Map<String,ArrayList<String>> extensionHeaders = (Map<String,ArrayList<String>>)incomingSession.getAttribute(EXTENSION_HEADERS);
addHeadersToMessage(outRequest, extensionHeaders, sipFactory);
outRequest.send();
Address originalFromAddress = request.getFrom();
SipURI originalFromUri = (SipURI) originalFromAddress.getURI();
Expand Down Expand Up @@ -626,4 +632,120 @@ public static boolean isB2BUASession(SipServletMessage sipMessage) {
return (linkedB2BUASession != null);
}

/**
* Modify Messages with new headers and header attributes
* Moved from CallManager and Call
* TODO: refactor/rename/handle more specific headers
* @param sipFactory SipFactory
* @param SipServletRequest message
* @param Map<String,ArrayList<String>> headers
*/
public static void addHeadersToMessage(SipServletRequest message, Map<String, ArrayList<String>> headers, SipFactory sipFactory) {
if (headers != null && sipFactory != null) {
for (Map.Entry<String, ArrayList<String>> entry : headers.entrySet()) {
//check if header exists
String headerName = entry.getKey();

if (logger.isDebugEnabled()) {
logger.debug("headerName=" + headerName + " headerVal=" + message.getHeader(headerName));
}

if( headerName.equalsIgnoreCase("Request-URI") ) {
//handle Request-URI
javax.servlet.sip.URI reqURI = message.getRequestURI();
if(logger.isDebugEnabled()) {
logger.debug("ReqURI="+reqURI.toString()+" msgReqURI="+message.getRequestURI());
}
for(String keyValPair :entry.getValue()){
String parName = "";
String parVal = "";
int equalsPos = keyValPair.indexOf("=");
parName = keyValPair.substring(0, equalsPos);
parVal = keyValPair.substring(equalsPos+1);
reqURI.setParameter(parName, parVal);
if(logger.isDebugEnabled()) {
logger.debug("ReqURI pars ="+parName+"="+parVal+" equalsPos="+equalsPos+" keyValPair="+keyValPair);
}
}

message.setRequestURI(reqURI);
if(logger.isDebugEnabled()) {
logger.debug("ReqURI="+reqURI.toString()+" msgReqURI="+message.getRequestURI());
}
} else if( headerName.equalsIgnoreCase("Route") ){
//handle Route
String headerVal = message.getHeader(headerName);
//TODO: do we want to add arbitrary parameters?

if(logger.isDebugEnabled()) {
logger.debug("ROUTE: "+headerName + "=" + headerVal);
}
//check how many pairs of host +port
for(String keyValPair :entry.getValue()){
String parName = "";
String parVal = "";
int equalsPos = keyValPair.indexOf("=");
if(equalsPos>0){
parName = keyValPair.substring(0, equalsPos);
}
parVal = keyValPair.substring(equalsPos+1);

if (parName.isEmpty() || parName.equalsIgnoreCase("host_name")) {
try {
if(logger.isDebugEnabled()) {
logger.debug("adding ROUTE parVal =" + parVal);
}
final SipURI uri = sipFactory.createSipURI(null, parVal);
message.pushRoute((SipURI)uri);
if(logger.isDebugEnabled()) {
logger.debug("added ROUTE parVal =" + uri.toString());
}
} catch (Exception e) {
if(logger.isDebugEnabled()) {
logger.debug("error adding ROUTE uri ="
+ parVal);
}
}

}

if(logger.isDebugEnabled()) {
logger.debug("ROUTE pars ="+parName+"="+parVal+" equalsPos="+equalsPos+" keyValPair="+keyValPair);
}
}
} else {
StringBuilder sb = new StringBuilder();
try {
String headerVal = message.getHeader(headerName);
if (headerVal != null && !headerVal.isEmpty()) {
if (entry.getValue() instanceof ArrayList) {
for (String pair : entry.getValue()) {
sb.append(";").append(pair);
}
}
message.setHeader(headerName,
headerVal + sb.toString());
} else {
if (entry.getValue() instanceof ArrayList) {
for (String pair : entry.getValue()) {
sb.append(pair).append(";");
}
}
message.addHeader(headerName, sb.toString());
}
} catch (IllegalArgumentException iae) {
logger.error("Exception while setting message header: "
+ iae.getMessage());
}
}

if (logger.isDebugEnabled()) {
logger.debug("headerName=" + headerName + " headerVal=" + message.getHeader(headerName));
}
}
} else {
logger.error("headers are null");
}
}

}
Expand Up @@ -125,6 +125,7 @@
import org.restcomm.connect.telephony.api.Reject;
import org.restcomm.connect.telephony.api.RemoveParticipant;
import org.restcomm.connect.telephony.api.StopWaiting;
import org.restcomm.connect.telephony.api.util.B2BUAHelper;

import akka.actor.ActorRef;
import akka.actor.Props;
Expand Down Expand Up @@ -998,7 +999,7 @@ public void execute(Object message) throws Exception {
addHeadersToMessage(invite, rcmlHeaders, "X-");

//the extension headers will override any headers
addHeadersToMessage(invite, extensionHeaders);
B2BUAHelper.addHeadersToMessage(invite, extensionHeaders, factory);

final SipSession session = invite.getSession();
session.setHandler("CallManager");
Expand Down Expand Up @@ -1063,70 +1064,6 @@ private void addHeadersToMessage(SipServletRequest message, Map<String, String>
}
}
}

/**
* Replace headers
* @param message
* @param headers
*/
private void addHeadersToMessage(SipServletRequest message, Map<String, ArrayList<String> > headers) {

if(headers!=null) {
for (Map.Entry<String, ArrayList<String>> entry : headers.entrySet()) {
//check if header exists
String headerName = entry.getKey();

StringBuilder sb = new StringBuilder();
if(entry.getValue() instanceof ArrayList){
for(String pair : entry.getValue()){
sb.append(";").append(pair);
}
}
if(logger.isDebugEnabled()) {
logger.debug("headerName="+headerName+" headerVal="+message.getHeader(headerName)+" concatValue="+sb.toString());
}
if(!headerName.equalsIgnoreCase("Request-URI")){
try {
String headerVal = message.getHeader(headerName);
if(headerVal!=null && !headerVal.isEmpty()) {
message.setHeader(headerName , headerVal+sb.toString());
}else{
message.addHeader(headerName , sb.toString());
}
} catch (IllegalArgumentException iae) {
if(logger.isErrorEnabled()) {
logger.error("Exception while setting message header: "+iae.getMessage());
}
}
}else{
//handle Request-URI
javax.servlet.sip.URI reqURI = message.getRequestURI();
if(logger.isDebugEnabled()) {
logger.debug("ReqURI="+reqURI.toString()+" msgReqURI="+message.getRequestURI());
}
for(String keyValPair :entry.getValue()){
String parName = "";
String parVal = "";
int equalsPos = keyValPair.indexOf("=");
parName = keyValPair.substring(0, equalsPos);
parVal = keyValPair.substring(equalsPos+1);
reqURI.setParameter(parName, parVal);
if(logger.isDebugEnabled()) {
logger.debug("ReqURI pars ="+parName+"="+parVal+" equalsPos="+equalsPos+" keyValPair="+keyValPair);
}
}

message.setRequestURI(reqURI);
if(logger.isDebugEnabled()) {
logger.debug("ReqURI="+reqURI.toString()+" msgReqURI="+message.getRequestURI());
}
}
if(logger.isDebugEnabled()) {
logger.debug("headerName="+headerName+" headerVal="+message.getHeader(headerName));
}
}
}
}
}

private final class Ringing extends AbstractAction {
Expand Down
Expand Up @@ -712,12 +712,13 @@ public void run() {
proxyUsername = er.getOutboundProxyUsername();
}
if (er.getOutboundProxyPassword() != null && !er.getOutboundProxyPassword().isEmpty()) {
proxyUsername = er.getOutboundProxyPassword();
proxyPassword = er.getOutboundProxyPassword();
}
// proxy DID or number if the outbound proxy fields are not empty in the restcomm.xml
if (proxyURI != null && !proxyURI.isEmpty()) {
//FIXME: not so nice to just inject headers here
addHeadersToMessage(request, er.getOutboundProxyHeaders());
B2BUAHelper.addHeadersToMessage(request, er.getOutboundProxyHeaders(), sipFactory);
request.getSession().setAttribute(B2BUAHelper.EXTENSION_HEADERS, er.getOutboundProxyHeaders());
proxyOut(request, client, toUser, toHost, toHostIpAddress, toPort, outboundIntf, proxyURI, proxyUsername, proxyPassword, from, to, callToSipUri);
} else {
errMsg = "Restcomm tried to proxy this call to an outbound party but it seems the outbound proxy is not configured.";
Expand Down Expand Up @@ -779,72 +780,6 @@ public void run() {

}

/**
* FIXME: duplicated code make into static function or something more optimized
* Replace headers
*
* @param message
* @param headers
*/
private void addHeadersToMessage(SipServletRequest message, Map<String, ArrayList<String>> headers) {

if (headers != null) {
for (Map.Entry<String, ArrayList<String>> entry : headers.entrySet()) {
//check if header exists
String headerName = entry.getKey();

StringBuilder sb = new StringBuilder();
if (entry.getValue() instanceof ArrayList) {
for (String pair : entry.getValue()) {
sb.append(";").append(pair);
}
}
if (logger.isDebugEnabled()) {
logger.debug("headerName=" + headerName + " headerVal=" + message.getHeader(headerName) + " concatValue=" + sb.toString());
}
if (!headerName.equalsIgnoreCase("Request-URI")) {
try {
String headerVal = message.getHeader(headerName);
if (headerVal != null && !headerVal.isEmpty()) {
message.setHeader(headerName, headerVal + sb.toString());
} else {
message.addHeader(headerName, sb.toString());
}
} catch (IllegalArgumentException iae) {
if (logger.isErrorEnabled()) {
logger.error("Exception while setting message header: " + iae.getMessage());
}
}
} else {
//handle Request-URI
javax.servlet.sip.URI reqURI = message.getRequestURI();
if (logger.isDebugEnabled()) {
logger.debug("ReqURI=" + reqURI.toString() + " msgReqURI=" + message.getRequestURI());
}
for (String keyValPair : entry.getValue()) {
String parName = "";
String parVal = "";
int equalsPos = keyValPair.indexOf("=");
parName = keyValPair.substring(0, equalsPos);
parVal = keyValPair.substring(equalsPos + 1);
reqURI.setParameter(parName, parVal);
if (logger.isDebugEnabled()) {
logger.debug("ReqURI pars =" + parName + "=" + parVal + " equalsPos=" + equalsPos + " keyValPair=" + keyValPair);
}
}

message.setRequestURI(reqURI);
if (logger.isDebugEnabled()) {
logger.debug("ReqURI=" + reqURI.toString() + " msgReqURI=" + message.getRequestURI());
}
}
if (logger.isDebugEnabled()) {
logger.debug("headerName=" + headerName + " headerVal=" + message.getHeader(headerName));
}
}
}
}

private boolean proxyOut(SipServletRequest request, Client client, String toUser, String toHost, String toHostIpAddress, String toPort, SipURI outboundIntf, String proxyURI, String proxyUsername, String proxyPassword, SipURI from, SipURI to, boolean callToSipUri) throws UnknownHostException {
final Configuration runtime = configuration.subset("runtime-settings");
final boolean useLocalAddressAtFromHeader = runtime.getBoolean("use-local-address", false);
Expand Down Expand Up @@ -2363,7 +2298,8 @@ public void response(final Object message) throws IOException {

// if this response is coming from a client that is in a p2p session with another registered client
// we will just proxy the response
if (B2BUAHelper.isB2BUASession(response)) {
SipSession linkedB2BUASession = B2BUAHelper.getLinkedSession(response);
if (linkedB2BUASession!=null) {
if (response.getStatus() == SipServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED
|| response.getStatus() == SipServletResponse.SC_UNAUTHORIZED) {
AuthInfo authInfo = sipFactory.createAuthInfo();
Expand All @@ -2380,6 +2316,9 @@ public void response(final Object message) throws IOException {
SipServletRequest invite = response.getRequest();
challengeRequest.setContent(invite.getContent(), invite.getContentType());
invite = challengeRequest;

Map<String,ArrayList<String>> extensionHeaders = (Map<String,ArrayList<String>>)linkedB2BUASession.getAttribute(B2BUAHelper.EXTENSION_HEADERS);
B2BUAHelper.addHeadersToMessage(challengeRequest, extensionHeaders, sipFactory);
challengeRequest.send();
} else {
B2BUAHelper.forwardResponse(response, patchForNatB2BUASessions);
Expand Down

0 comments on commit 7589e41

Please sign in to comment.