package com.logentries.net;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
/**
* Client for sending messages to Logentries via HTTP PUT or Token-Based Logging
* Supports SSL/TLS
*
* @author Mark Lacomber
*
*/
public class LogentriesClient
{
/*
* Constants
*/
/** Logentries API server address for Token-based input. */
private static final String LE_TOKEN_API = "data.logentries.com";
/** Logentries API server address for HTTP PUT input. */
private static final String LE_HTTP_API = "api.logentries.com";
/** Port number for HTTP PUT/Token TCP logging on Logentries server. */
private static final int LE_PORT = 80;
/** Port number for SSL HTTP PUT/TLS Token TCP logging on Logentries server. */
private static final int LE_SSL_PORT = 443;
final SSLSocketFactory ssl_factory;
private boolean ssl_choice = false;
private boolean http_choice = false;
private Socket socket;
private OutputStream stream;
private String dataHubServer = LE_TOKEN_API;
private int dataHubPort = LE_PORT;
private boolean useDataHub = false;
public LogentriesClient(boolean httpPut, boolean ssl, boolean isUsingDataHub, String server, int port)
{
if(isUsingDataHub){
ssl_factory = null; // DataHub does not support input over SSL for now,
ssl_choice = false; // so SSL flag is ignored
useDataHub = isUsingDataHub;
dataHubServer = server;
dataHubPort = port;
}
else{
ssl_factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
ssl_choice = ssl;
http_choice = httpPut;
}
}
public int getPort()
{
if(useDataHub)
{
return dataHubPort;
}
else{
return ssl_choice ? LE_SSL_PORT : LE_PORT;
}
}
public String getAddress()
{
if(useDataHub)
{
return dataHubServer;
}
else{
return http_choice ? LE_HTTP_API : LE_TOKEN_API;
}
}
public void connect() throws UnknownHostException, IOException
{
if(ssl_choice) {
if(http_choice)
{
SSLSocket s = (SSLSocket) ssl_factory.createSocket( getAddress(), getPort() );
s.setTcpNoDelay( true);
s.startHandshake();
socket = s;
}else{
socket = SSLSocketFactory.getDefault().createSocket( getAddress(), getPort() );
}
}else{
socket = new Socket( getAddress(), getPort() );
}
this.stream = socket.getOutputStream();
}
public void write(byte[] buffer, int offset, int length) throws IOException
{
if(this.stream == null){
throw new IOException();
}
this.stream.write(buffer, offset, length);
this.stream.flush();
}
public void close()
{
try{
if (this.socket != null)
{
this.socket.close();
this.socket = null;
}
}catch(Exception e){
}
}
}