Sample Code for Basic Authentication {#ID-00000888}
===================================================

The sample below shows how you can upload a batch file to a batch server using Basic Authentication.

```ph codeph
import java.util.*;
import java.io.*;
import javax.net.ssl.*;
import java.security.*;
public class SSLFileTransfer {
	Properties props = new Properties(); // stores properties from property file
	/**
	 * Default constructor
	 */
	public SSLFileTransfer() {}
	/**
	 * Initialize program by reading properties file.
	 *
	 * @param propsFile needed for file transfer
	 */
	public void init(String propsFile) {
		try {
			props.load(new BufferedInputStream(new FileInputStream(new File(propsFile))));
		} catch (Exception e) {
			e.printStackTrace();
			System.exit(-1);
		}
	}
	/**
	 * Error message if incorrect arguments are passed.
	 */
	public static void usage() {
		System.out.println("USAGE: java SSLFileTransfer &lt;full path property file name&gt;");
		System.exit(-1);
	}
	/**
	 * Get factory for authentication
	 *
	 * @throws IOException if exception occurs
	 */
	private SSLSocketFactory getFactory() throws IOException {
		try {
			SSLContext ctx;
			KeyManagerFactory kmf;
			KeyStore ks, ks1;
			char[] passphrase =	props.getProperty("passPhrase").toCharArray();
			ctx = SSLContext.getInstance("TLSv1.2");
			kmf = KeyManagerFactory.getInstance("SunX509");
			ks = KeyStore.getInstance("PKCS12");
			ks1 = KeyStore.getInstance("JKS");
			ks.load(new FileInputStream(props.getProperty("key")), passphrase);
			ks1.load(new FileInputStream(props.getProperty("keyStore")), passphrase);
			kmf.init(ks, passphrase);
			TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
			tmf.init(ks1);
			ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
			return ctx.getSocketFactory();
		} catch (Exception e) {
			e.printStackTrace();
			throw new IOException(e.getMessage());
		}
	 }
	/**
	 * Get host from property file
	 */
	private String getHost() {
		return props.getProperty("host", "localhost");
	}
	/**
	 * Get port from property file
	 */
	private int getPort() {
		return Integer.parseInt(props.getProperty("port"));
	}
	/**
	 * Send request (file) to the server.
	 * 
	 * @param out outstream to send the data to the server
	 * @throws Exception if an error occurs.
	 */
	private void sendRequest(PrintWriter out) throws Exception {
		final String CRLF = "\r\n";
		String path = props.getProperty("path");
		out.print("POST " + path + " HTTP/1.1" + CRLF);
		final String BOUNDARY = "7d03135102b8";
		out.print("Host: " + props.getProperty("host") + CRLF);
		out.print("Content-Type: multipart/form-data; boundary="+BOUNDARY+CRLF);
		String uploadFile = props.getProperty("uploadFile");
		String authString = props.getProperty("bcUserName") + ":" + props.getProperty("bcPassword");
		String encodedAuthString = "Basic " + new sun.misc.BASE64Encoder().encode(authString.getBytes ());
		out.print("Authorization: " + encodedAuthString+CRLF);
		StringBuffer sbuf = new StringBuffer();
		sbuf.append("--"+BOUNDARY+CRLF);
		sbuf.append("Content-Disposition: form-data; name=\"upfile\"; filename=\"" + uploadFile + "\""+CRLF);
		sbuf.append("Content-Type: text/plain"+CRLF+CRLF);
		char[] buf;
		int cnt;
		FileReader fi = new FileReader(uploadFile);
		try {
			buf = new char[1024000];
			cnt = fi.read(buf);
		} finally {
			fi.close();
		}
		sbuf.append(buf, 0, cnt);
		sbuf.append(CRLF);
		sbuf.append("--"+BOUNDARY+"--"+CRLF);
		int sz = sbuf.length();
		out.print("Content-Length: "+ sz+CRLF);
		out.print(CRLF);
		out.print(sbuf);
		out.flush();
		// Make sure there were no surprises
		if (out.checkError()) {
			System.out.println("SSLFileTransfer: java.io.PrintWriter error");
		}
	}
	/**
	 * Reads the response from the server.
	 * @param in instream to get the data from the server
	 * @throws Exception if an error occurs.
	 */
	private void readResponse(BufferedReader in) throws Exception {
		boolean successful = false;
		String inputLine;
		while ((inputLine = in.readLine()) != null) {
			if (inputLine.startsWith("HTTP") && inputLine.indexOf("200") &gt;= 0) {
				successful = true;
			}
			System.out.println(inputLine);
		 }
		System.out.println("UPLOAD FILE " + (successful? "SUCCESSFUL" :	"FAILED") + "!!!\n");
	}
	/**
	 * Upload file to the server.
	 * @throws Exception if an error occurs.
	 */
	public void upload() throws Exception {
		try {
			SSLSocketFactory factory = getFactory();
			SSLSocket socket = (SSLSocket)factory.createSocket(getHost(), getPort());
			PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
			BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			socket.startHandshake();
			sendRequest(out);
			readResponse(in);
			out.close();
			in.close();
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		}
	}
	/**
	 * Main method to start file transfer
	 * @param args command line arguments (property file, see usage())
	 * @throws Exception if an error occurs.
	 */
	public static void main(String[] args) throws Exception {
		if (args == null || args.length != 1) {
			usage();
		}
		SSLFileTransfer fileXfer = new SSLFileTransfer();
		fileXfer.init(args[0]);
		fileXfer.upload();
	}
}
```

