/** * Creates a SIP response message. * * @param req the request message * @param code the response code * @param reason the response reason * @param contact the contact address * @param local_tag the local tag in the 'To' header * @param body the message body */ public static Message createResponse( Message req, int code, String reason, String local_tag, NameAddress contact, String content_type, String body) { Message resp = new Message(); resp.setStatusLine(new StatusLine(code, reason)); resp.setVias(req.getVias()); if (code >= 180 && code < 300 && req.hasRecordRouteHeader()) resp.setRecordRoutes(req.getRecordRoutes()); ToHeader toh = req.getToHeader(); if (local_tag != null) toh.setParameter("tag", local_tag); resp.setToHeader(toh); resp.setFromHeader(req.getFromHeader()); resp.setCallIdHeader(req.getCallIdHeader()); resp.setCSeqHeader(req.getCSeqHeader()); if (contact != null) resp.setContactHeader(new ContactHeader(contact)); // add Server header field if (SipStack.server_info != null) resp.setServerHeader(new ServerHeader(SipStack.server_info)); // if (body!=null) resp.setBody(body); else resp.setBody(""); if (content_type == null) resp.setBody(body); else resp.setBody(content_type, body); // System.out.println("DEBUG: MessageFactory: // response:\n"+resp.toString()); return resp; }
/** * Creates a SIP request message. * * @param method method name * @param request_uri request-uri * @param to ToHeader NameAddress * @param from FromHeader NameAddress * @param contact Contact NameAddress (if null, no ContactHeader is added) * @param host_addr Via address * @param host_port Via port number * @param call_id Call-ID value * @param cseq CSeq value * @param local_tag tag in FromHeader * @param remote_tag tag in ToHeader (if null, no tag is added) * @param branch branch value (if null, a random value is picked) * @param body body (if null, no body is added) * @param qvalue Q value (if ICSI is null, no Q value is added) * @param icsi ICSI (if null, no ICSI is added) */ public static Message createRequest( String method, SipURL request_uri, NameAddress to, NameAddress from, NameAddress contact, String proto, String via_addr, int host_port, boolean rport, String call_id, long cseq, String local_tag, String remote_tag, String branch, String body, String qvalue, String icsi) { // modified by mandrajg Message req = new Message(); // mandatory headers first (To, From, Via, Max-Forwards, Call-ID, CSeq): req.setRequestLine(new RequestLine(method, request_uri)); ViaHeader via = new ViaHeader(proto, via_addr, host_port); if (rport) via.setRport(); if (branch == null) branch = SipProvider.pickBranch(); via.setBranch(branch); req.addViaHeader(via); req.setMaxForwardsHeader(new MaxForwardsHeader(70)); if (remote_tag == null) req.setToHeader(new ToHeader(to)); else req.setToHeader(new ToHeader(to, remote_tag)); req.setFromHeader(new FromHeader(from, local_tag)); req.setCallIdHeader(new CallIdHeader(call_id)); req.setCSeqHeader(new CSeqHeader(cseq, method)); // optional headers: // start modification by mandrajg if (contact != null) { if (((method == "REGISTER") || (method == "INVITE")) && (icsi != null)) { MultipleHeader contacts = new MultipleHeader(SipHeaders.Contact); contacts.addBottom(new ContactHeader(contact, qvalue, icsi)); req.setContacts(contacts); } else { MultipleHeader contacts = new MultipleHeader(SipHeaders.Contact); contacts.addBottom(new ContactHeader(contact)); req.setContacts(contacts); } // System.out.println("DEBUG: Contact: "+contact.toString()); } if ((method == "INVITE") && (icsi != null)) { req.setAcceptContactHeader(new AcceptContactHeader(icsi)); } // end modifications by mandrajg req.setExpiresHeader(new ExpiresHeader(String.valueOf(SipStack.default_expires))); // add User-Agent header field if (SipStack.ua_info != null) req.setUserAgentHeader(new UserAgentHeader(SipStack.ua_info)); // if (body!=null) req.setBody(body); else req.setBody(""); req.setBody(body); // System.out.println("DEBUG: MessageFactory: request:\n"+req); return req; }
/** When the TransactionClient goes into the "Completed" state receiving a 300-699 response */ public void onTransFailureResponse(TransactionClient tc, Message msg) { // SESCA // Autentikointi String method = tc.getTransactionMethod(); StatusLine status_line = msg.getStatusLine(); int code = status_line.getCode(); // AUTHENTICATION-BEGIN if ((code == 401 && msg.hasWwwAuthenticateHeader() && msg.getWwwAuthenticateHeader().getRealmParam().equalsIgnoreCase(user_profile.realm)) || (code == 407 && msg.hasProxyAuthenticateHeader() && msg.getProxyAuthenticateHeader() .getRealmParam() .equalsIgnoreCase(user_profile.realm))) { // req:ssa on cseq:ua kasvatettu Message req = tc.getRequestMessage(); req.setCSeqHeader(req.getCSeqHeader().incSequenceNumber()); WwwAuthenticateHeader wah; if (code == 401) wah = msg.getWwwAuthenticateHeader(); else wah = msg.getProxyAuthenticateHeader(); String qop_options = wah.getQopOptionsParam(); qop = (qop_options != null) ? "auth" : null; RequestLine rl = req.getRequestLine(); // SESCA // BUGI client ei saa lähettää qop:ia // DigestAuthentication digest=new // DigestAuthentication(rl.getMethod(),rl.getAddress().toString(),wah,qop,null,username,passwd); DigestAuthentication digest = new DigestAuthentication( rl.getMethod(), rl.getAddress().toString(), wah, null, null, user_profile.authID, user_profile.passwd); AuthorizationHeader ah; if (code == 401) ah = digest.getAuthorizationHeader(); else ah = digest.getProxyAuthorizationHeader(); req.setAuthorizationHeader(ah); // transactions.remove(tc.getTransactionId()); // SESCA // BUGI // Päivitetään invite_req:uun uusin invite-viesti. // Lähetämme uuden inviten, joten teemme uuden invitetransactionclientin, eikä transaction // clientia // if (method.equals(SipMethods.INVITE)) { // invite_req = req; // tc=new InviteTransactionClient(sip_provider,req,this); tc = new TransactionClient(sip_provider, req, this); // tc=new TransactionClient(sip_provider,req,this); // } // else { // tc=new TransactionClient(sip_provider,req,this); // } // transactions.put(tc.getTransactionId(),tc); tc.request(); } // AUTHENTICATION-END else onDeliveryFailure(tc, msg.getStatusLine().getReason()); }