protected void start() { int mf = _request.getMaxForwards(); if (mf == -1) mf = __maxForwards; else mf--; _request.setMaxForwards(mf); _request.setRequestURI(_uri); if (_branchRRUri != null) _request.addRecordRoute(new NameAddr(_branchRRUri)); if (_branchPathUri != null && _request.isRegister()) _request.addAddressHeader(SipHeaders.PATH, new NameAddr(_branchPathUri), true); // _ctx = _request.getCallSession().getServer().sendRequest(_request, this); try { _ctx = _request.session().sendRequest(_request, this); if (_request.isInvite()) startTimerC(); _actives++; } catch (Exception e) { LOG.debug(e); // TODO } }
public void handleCancel(ServerTransaction tx, SipRequest cancel) { cancel.setSession(_tx.getRequest().session()); SipResponse response = new SipResponse(cancel, SipServletResponse.SC_OK, null); ((ServerTransaction) cancel.getTransaction()).send(response); cancel(); try { if (!_started) // case no request has not been proxied _tx.getRequest().createResponse(SipServletResponse.SC_REQUEST_TERMINATED).send(); cancel.session().invokeServlet(cancel); } catch (Exception e) { LOG.debug(e); } }
public void handleResponse(SipResponse response) { _response = response; int status = response.getStatus(); if (status == 100) return; if (_tx.isCompleted() && !response.is2xx()) { if (LOG.isDebugEnabled()) LOG.debug("Dropping response " + response.getStatus() + " since proxy is completed"); return; } if (LOG.isDebugEnabled()) LOG.debug("Got response {}", response, null); SipRequest request = _tx.getRequest(); Session session = request.session(); if (request.isInitial() && status < 300) { if (!session.isSameDialog(response)) { AppSession appSession = session.appSession(); Session derived = appSession.getSession(response); if (derived == null) derived = appSession.createDerivedSession(session); session = derived; } } response.setSession(session); if (status < 300) session.updateState(response, false); response.removeTopVia(); response.setProxyBranch(this); if (status < 200) { if (response.isInvite()) updateTimerC(); invokeServlet(response); forward(response); } else { _actives--; stopTimerC(); if ((300 <= status && status < 400) && _branchRecurse) { try { Iterator<Address> it = response.getAddressHeaders(SipHeaders.CONTACT); while (it.hasNext()) { Address contact = (Address) it.next(); if (contact.getURI().isSipURI()) { Branch branch = addTarget(contact.getURI()); if (branch != null) { _recursedBranches = LazyList.add(_recursedBranches, branch); branch.setRecurse(_branchRecurse); } } } } catch (ServletParseException e) { LOG.ignore(e); } } if (_best == null || (_best.getStatus() < 600 && (status < _best.getStatus() || status >= 600))) { _best = response; } if (status >= 600) { SipProxy.this.doCancel(null, null, null); } if (status < 300) { invokeServlet(response); forward(response); SipProxy.this.doCancel(null, null, null); } else { if (LazyList.size(_targets) > 0) startProxy(); if (_actives > 0) { response.setBranchResponse(true); invokeServlet(response); } else { tryFinal(); } } } }