Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
gov.nist.javax.sip.stack.NioWebSocketMessageChannel Maven / Gradle / Ivy
/*
* Conditions Of Use
*
* This software was developed by employees of the National Institute of
* Standards and Technology (NIST), an agency of the Federal Government.
* Pursuant to title 15 Untied States Code Section 105, works of NIST
* employees are not subject to copyright protection in the United States
* and are considered to be in the public domain. As a result, a formal
* license is not needed to use the software.
*
* This software is provided by NIST as a service and is expressly
* provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
* AND DATA ACCURACY. NIST does not warrant or make any representations
* regarding the use of the software or the results thereof, including but
* not limited to the correctness, accuracy, reliability or usefulness of
* the software.
*
* Permission to use this software is contingent upon your acceptance
* of the terms of this agreement
*
* .
*
*/
package android.gov.nist.javax.sip.stack;
import android.gov.nist.core.CommonLogger;
import android.gov.nist.core.Host;
import android.gov.nist.core.HostPort;
import android.gov.nist.core.LogWriter;
import android.gov.nist.core.StackLogger;
import android.gov.nist.javax.sip.header.RecordRoute;
import android.gov.nist.javax.sip.message.SIPMessage;
import android.gov.nist.javax.sip.message.SIPRequest;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.text.ParseException;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicBoolean;
import android.javax.sip.address.SipURI;
import android.javax.sip.address.URI;
import android.javax.sip.header.ContactHeader;
import android.javax.sip.header.RecordRouteHeader;
import android.javax.sip.header.ViaHeader;
import android.javax.sip.message.Request;
public class NioWebSocketMessageChannel extends NioTcpMessageChannel{
private static StackLogger logger = CommonLogger
.getLogger(NioWebSocketMessageChannel.class);
private WebSocketCodec codec = new WebSocketCodec(true, true);
boolean readingHttp = true;
String httpInput = "";
boolean client;
AtomicBoolean httpClientRequestSent=new AtomicBoolean(false);
String httpHostHeader;
String httpMethod;
String httpLocation;
private SIPTransactionStack stack;
public static NioWebSocketMessageChannel create(SIPTransactionStack stack,
NioWebSocketMessageProcessor nioTcpMessageProcessor,
SocketChannel socketChannel) throws IOException {
NioWebSocketMessageChannel retval = (NioWebSocketMessageChannel) channelMap.get(socketChannel);
if (retval == null) {
retval = new NioWebSocketMessageChannel(stack,nioTcpMessageProcessor,
socketChannel);
channelMap.put(socketChannel, retval);
}
return retval;
}
protected NioWebSocketMessageChannel(SIPTransactionStack stack,NioTcpMessageProcessor nioTcpMessageProcessor,
SocketChannel socketChannel) throws IOException {
super(nioTcpMessageProcessor,socketChannel);
this.stack=stack;
messageProcessor = nioTcpMessageProcessor;
myClientInputStream = socketChannel.socket().getInputStream();
}
@Override
protected void sendMessage(final byte[] msg, final boolean isClient) throws IOException {
if (logger.isLoggingEnabled(LogWriter.TRACE_DEBUG)) {
logger.logDebug("sendMessage isClient = " + isClient + " this = " + this);
}
lastActivityTimeStamp = System.currentTimeMillis();
NIOHandler nioHandler = ((NioTcpMessageProcessor) messageProcessor).nioHandler;
if(this.socketChannel != null && this.socketChannel.isConnected() && this.socketChannel.isOpen()) {
nioHandler.putSocket(NIOHandler.makeKey(this.peerAddress, this.peerPort), this.socketChannel);
}
sendWrapped(msg, this.peerAddress, this.peerPort, isClient);
}
protected void sendNonWebSocketMessage(byte[] msg, boolean isClient) throws IOException {
if (logger.isLoggingEnabled(LogWriter.TRACE_DEBUG)) {
logger.logDebug("sendMessage isClient = " + isClient + " this = " + this);
}
lastActivityTimeStamp = System.currentTimeMillis();
NIOHandler nioHandler = ((NioTcpMessageProcessor) messageProcessor).nioHandler;
if(this.socketChannel != null && this.socketChannel.isConnected() && this.socketChannel.isOpen()) {
nioHandler.putSocket(NIOHandler.makeKey(this.peerAddress, this.peerPort), this.socketChannel);
}
super.sendTCPMessage(msg, this.peerAddress, this.peerPort, isClient);
}
public static byte[] wrapBufferIntoWebSocketFrame(byte[] buffer, boolean client) {
try {
return WebSocketCodec.encode(buffer, 0, true, client);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public void sendWrapped(byte message[], InetAddress receiverAddress,
int receiverPort, boolean retry) throws IOException {
if(client && readingHttp && httpClientRequestSent.compareAndSet(false, true)) {
String http = "null null HTTP/1.1\r\n" +
"Host: null \r\n" +
"Upgrade: websocket\r\n" +
"Connection: Upgrade\r\n" +
"Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n" +
"Sec-WebSocket-Protocol: sip\r\n" +
"Sec-WebSocket-Version: 13\r\n\r\n";
super.sendTCPMessage(http.getBytes(), receiverAddress, receiverPort, false);
try {
Thread.sleep(150);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
message = wrapBufferIntoWebSocketFrame(message, client);
super.sendTCPMessage(message, receiverAddress, receiverPort, retry);
}
@Override
public void sendMessage(final byte message[], final InetAddress receiverAddress,
final int receiverPort, final boolean retry) throws IOException {
sendWrapped(message, receiverAddress, receiverPort, retry);
}
@Override
public void sendMessage(SIPMessage sipMessage, InetAddress receiverAddress, int receiverPort)
throws IOException {
if(sipMessage instanceof SIPRequest)
{
if(client && httpClientRequestSent.compareAndSet(false, true)) {
SIPRequest request = (SIPRequest) sipMessage;
SipURI requestUri = (SipURI) request.getRequestURI();
this.httpHostHeader = requestUri.getHeader("Host");
this.httpLocation = requestUri.getHeader("Location");
this.httpMethod = requestUri.getMethodParam();
String http = this.httpMethod + " " + this.httpLocation + " HTTP/1.1\r\n" +
"Host: " + this.httpHostHeader + "\r\n" +
"Upgrade: websocket\r\n" +
"Connection: Upgrade\r\n" +
"Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n" +
"Sec-WebSocket-Protocol: sip\r\n" +
"Sec-WebSocket-Version: 13\r\n\r\n";
super.sendTCPMessage(http.getBytes(), receiverAddress, receiverPort, false);
try {
Thread.sleep(150);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
super.sendMessage(sipMessage, receiverAddress, receiverPort);
}
public NioWebSocketMessageChannel(InetAddress inetAddress, int port,
SIPTransactionStack sipStack,
NioTcpMessageProcessor nioTcpMessageProcessor) throws IOException {
super(inetAddress, port, sipStack, nioTcpMessageProcessor);
client = true;
this.stack=sipStack;
this.codec = new WebSocketCodec(false, true);
}
@Override
protected void addBytes(byte[] bytes) throws Exception {
String s = new String(bytes);
if(readingHttp) {
byte[] remaining = null;
for(int q=0;q