📄 requestforwarding.java
字号:
/* * RequestForwarding.java * * Created on April 16, 2003, 11:08 AM */package gov.nist.examples.mail;import java.util.*;import javax.sip.*;import javax.sip.message.*;import javax.sip.header.*;import javax.sip.address.*;/** * * @author Deruelle */public class RequestForwarding { protected Controller controller; /** Creates a new instance of RequestForwarding */ public RequestForwarding(Controller controller) { this.controller=controller; } public void forwardRequest(Vector targetsURIList,SipProvider sipProvider,Request request, ServerTransaction serverTransaction) { MessageFactory messageFactory=controller.getMessageFactory(); HeaderFactory headerFactory=controller.getHeaderFactory(); AddressFactory addressFactory=controller.getAddressFactory(); StackConfiguration stackConfiguration=controller.getStackConfiguration(); try{ for (int i=0;i<targetsURIList.size();i++) { URI targetURI=(URI)targetsURIList.elementAt(i); /*******************************************************************************//************** 1. Make a copy of the received request **********//*******************************************************************************/ Request clonedRequest = (Request) request.clone(); System.out.println("RequestForwarding, forwardRequest() (STEP 1),"+ " the request is cloned");/*******************************************************************************//************** 2. Update the Request-URI **********//*******************************************************************************/ /* The Request-URI in the copy's start line MUST be replaced with the URI for this target. If the URI contains any parameters not allowed in a Request-URI, they MUST be removed. */ // All the targets URI are already canonicalized clonedRequest.setRequestURI(targetURI); System.out.println("RequestForwarding, forwardRequest() (STEP 2),"+ " The Request-URI in the copy's start line is replaced with"+ " the URI for this target"); /*******************************************************************************//************** 8. Add a Via header field value **********//*******************************************************************************/ /* The controller MUST insert a Via header field value into the copy before the existing Via header field values. */ SipStack sipStack=sipProvider.getSipStack(); String stackIPAddress=sipStack.getIPAddress(); //SipStack oppositeSipStack=controller.getOppositeSipStack(stackIPAddress); ViaHeader viaHeader=controller.getStackViaHeader(sipStack); if (viaHeader!=null) clonedRequest.addHeader(viaHeader); Iterator lps=sipStack.getListeningPoints(); ListeningPoint lp=(ListeningPoint)lps.next(); SipURI sipURI=controller.addressFactory.createSipURI(null,sipStack.getIPAddress()); sipURI.setPort(lp.getPort()); Address address=controller.addressFactory.createAddress(null,sipURI); RecordRouteHeader recordRouteHeader= controller.headerFactory.createRecordRouteHeader(address); ListIterator recordRouteHeaders=clonedRequest.getHeaders (RecordRouteHeader.NAME); clonedRequest.removeHeader(RecordRouteHeader.NAME); Vector v=new Vector(); v.addElement(recordRouteHeader); // add the other record route headers. while( recordRouteHeaders!=null && recordRouteHeaders.hasNext()) { recordRouteHeader=(RecordRouteHeader)recordRouteHeaders.next(); v.addElement(recordRouteHeader); } forwardRequestStatelessly(sipProvider, clonedRequest,request,serverTransaction,sipStack); } } catch (Exception ex){ try{ System.out.println("RequestForwarding, forwardRequest(), "+ " internal error, "+ "exception raised:"); ex.printStackTrace(); // This is an internal error: // Let's return a 500 SERVER_INTERNAL_ERROR Response response=messageFactory.createResponse (Response.SERVER_INTERNAL_ERROR,request); if (serverTransaction!=null) serverTransaction.sendResponse(response); else sipProvider.sendResponse(response); System.out.println( "RequestForwarding, forwardRequest(), 500 SERVER_INTERNAL_ERROR replied:\n"+ response.toString()); } catch (Exception e){ e.printStackTrace(); } } } public void forwardRequestStatelessly(SipProvider sipProvider, Request clonedRequest,Request originalRequest,ServerTransaction serverTransaction, SipStack sipStack) { MessageFactory messageFactory=controller.getMessageFactory(); HeaderFactory headerFactory=controller.getHeaderFactory(); AddressFactory addressFactory=controller.getAddressFactory(); try{ // We forward statelessly: // It means the Request does not create dialogs... Iterator iter=sipStack.getSipProviders(); ClientTransaction clientTransaction=((SipProvider)iter.next()).getNewClientTransaction(clonedRequest); if(clientTransaction!=null){ System.out.println ("RequestForwarding, forwardRequestStatelessly(), "+ " cloned request forwarded with the clientTransaction:\n"); clientTransaction.sendRequest(); } else{ System.out.println ("RequestForwarding, forwardRequestStatelessly(), "+ " cloned request forwarded with the sipProvider:\n"); ((SipProvider)iter.next()).sendRequest(clonedRequest); } System.out.println ("RequestForwarding, forwardRequestStatelessly(), "+ " cloned request forwarded statelessly:\n"+clonedRequest.toString()); } catch (Exception ex){ try{ System.out.println("RequestForwarding, forwardRequestStatelessly(), "+ " internal error, "+ "exception raised:"); ex.printStackTrace(); // This is an internal error: // Let's return a 500 SERVER_INTERNAL_ERROR Response response=messageFactory.createResponse (Response.SERVER_INTERNAL_ERROR,originalRequest); if (serverTransaction!=null) serverTransaction.sendResponse(response); else sipProvider.sendResponse(response); System.out.println( "RequestForwarding, forwardRequestStatelessly(), 500 SERVER_INTERNAL_ERROR replied:\n"+ response.toString()); } catch (Exception e){ e.printStackTrace(); } } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -