Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.BufferedReader;
- import java.io.DataOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.InputStreamReader;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.Date;
- import java.util.StringTokenizer;
- public class HTTPServer {
- public static final int MIMETYPE_HTML = 0;
- public static final int MIMETYPE_JPEG = 2;
- public static final int MIMETYPE_ZIP = 3;
- public static final int MIMETYPE_GIF = 4;
- public static final int MIMETYPE_PNG = 5;
- public static final int MIMETYPE_MP3 = 6;
- public static final int MIMETYPE_ASF = 7;
- public static final String serverVersion = "Custom Web server v.0.1";
- public static String wwwRoot;
- HTTPServerConsole console = null;
- ServerSocket serverSocket = null;
- public HTTPServer(int port, HTTPServerConsole console, String wwwRoot) {
- this.wwwRoot = wwwRoot;
- this.console = console;
- try {
- console.logInfo("Trying to bind server to port " + port);
- serverSocket = new ServerSocket(port);
- console.logInfo("Server bound to port: " + port);
- console.logInfo("Server started normally");
- } catch(Exception e) {
- console.logError(e.toString());
- }
- }
- public void run() {
- while(true) {
- try {
- console.logInfo("Waiting for connections");
- Socket clientConnection = serverSocket.accept();
- console.logInfo("Incoming connection from " + clientConnection.getInetAddress().getHostName());
- BufferedReader bis = new BufferedReader(new InputStreamReader(clientConnection.getInputStream()));
- DataOutputStream dos = new DataOutputStream(clientConnection.getOutputStream());
- protocolHandler(bis, dos);
- } catch(Exception e) {
- console.logError(e.toString());
- }
- }
- }
- private void protocolHandler(BufferedReader input, DataOutputStream output) {
- try {
- String request = input.readLine();
- System.out.println(request);
- //processing the request
- if (request == null) {
- //null request is not valid
- output.writeBytes(constructHTTPHeader(403, MIMETYPE_HTML));
- output.close();
- console.logError("Request is null");
- return;
- }
- //process the request
- StringTokenizer strTok = new StringTokenizer(request, " ");
- String reqMethod = strTok.nextToken();
- String resourceName = strTok.nextToken().substring(1); //remove slash
- if (reqMethod.equals("HEAD") || reqMethod.equals("GET") || reqMethod.equals("OPTIONS")) {
- try {
- console.logInfo("Client requested resource:" + new File(wwwRoot + resourceName).getAbsolutePath());
- FileInputStream fis = new FileInputStream(wwwRoot + resourceName);
- //check the type of resource
- if (supportedResource(resourceName)) {
- output.writeBytes(constructHTTPHeader(200, getMimeType(wwwRoot + resourceName)));
- if (reqMethod.equals("GET")){
- while (true) { //write the resource to the stream
- int b = fis.read();
- if (b == -1) {
- break; // end of file
- }
- output.write(b);}
- }
- output.close();
- fis.close();
- return;
- } else { //media type not supported
- output.writeBytes(constructHTTPHeader(403, MIMETYPE_HTML)); //access to this resource is forbidden
- output.close();
- console.logError("Resource type not supported:" + resourceName);
- return;
- }
- } catch(FileNotFoundException fnf) {
- output.writeBytes(constructHTTPHeader(404, MIMETYPE_HTML));
- output.close();
- console.logError("Resource not found");
- return;
- } catch(SecurityException se) {
- output.writeBytes(constructHTTPHeader(403, MIMETYPE_HTML));
- console.logError("Access is denied");
- output.close();
- return;
- }catch(Exception e) {
- output.writeBytes(constructHTTPHeader(500, MIMETYPE_HTML));
- output.close();
- return;
- }
- } else {
- output.writeBytes(constructHTTPHeader(501, 0)); //not implemented
- output.close();
- return;
- }
- } catch(Exception e) {
- console.logError("ERROR" + e.toString());
- }
- }
- private boolean supportedResource(String resource) {
- String cResource = resource.toUpperCase();
- if(cResource.endsWith(".JPEG") ||
- cResource.endsWith(".JPG") ||
- cResource.endsWith(".PNG") ||
- cResource.endsWith(".GIF") ||
- cResource.endsWith(".ZIP") ||
- cResource.endsWith("MP3") ||
- cResource.endsWith("WMV") ||
- cResource.endsWith(".HTML")) {
- return true;
- } else {
- return false;
- }
- }
- private int getMimeType(String resource) {
- String cResource = resource.toUpperCase();
- if (cResource.endsWith(".JPG") || cResource.endsWith(".JPEG"))
- return this.MIMETYPE_JPEG;
- else if (cResource.endsWith(".GIF") )
- return this.MIMETYPE_GIF;
- else if (cResource.endsWith(".PNG"))
- return this.MIMETYPE_PNG;
- else if (cResource.endsWith(".ZIP"))
- return this.MIMETYPE_ZIP;
- else if (cResource.endsWith(".MP3"))
- return this.MIMETYPE_MP3;
- else if (cResource.endsWith(".WMV"))
- return this.MIMETYPE_ASF;
- else //html
- return this.MIMETYPE_HTML;
- }
- private String constructHTTPHeader(int replyCode, int mimeType) {
- File file = new File(wwwRoot);
- String replyHeader = "HTTP/1.1 ";
- switch(replyCode) {
- case 200:
- replyHeader += "200 OK";
- break;
- case 400:
- replyHeader += "400 Bad Request";
- break;
- case 404:
- replyHeader += "404 Not Found";
- break;
- case 403:
- replyHeader += "403 Forbidden";
- break;
- case 501:
- replyHeader += "501 NOT Implemented";
- break;
- case 500:
- replyHeader += "500 Internal Server error";
- break;
- }
- replyHeader += "\r\n";
- Date d = new Date();
- replyHeader += "Date:" + d.toString() + "\r\n";
- //replyHeader += "Server:" + serverVersion + "\r\n";
- replyHeader += "Allow: GET, HEAD, OPTIONS\r\n";//It usually appears on a 405 error message, but as this message isn't handled above, the Allow option appears every time
- replyHeader += "Connection: close\r\n";
- replyHeader += "Content-Length: " + file.length() + "\r\n";
- replyHeader += "Last-Modified: " + file.lastModified() + "\r\n";
- switch(mimeType) {
- case MIMETYPE_JPEG:
- replyHeader += "Content-Type: image/jpeg\r\n";
- break;
- case MIMETYPE_PNG:
- replyHeader += "Content-Type: image/png\r\n";
- break;
- case MIMETYPE_GIF:
- replyHeader += "Content-Type: image/GIF\r\n";
- break;
- case MIMETYPE_ZIP:
- replyHeader += "Content-Type: application/zip\r\n";
- break;
- case MIMETYPE_MP3:
- replyHeader += "Content-Type: audio/mp3\r\n";
- break;
- case MIMETYPE_ASF:
- replyHeader += "Content-Type: video/x-ms-asf\r\n";
- break;
- default:
- replyHeader += "Content-Type: text/html\r\n";
- break;
- }
- replyHeader += "\r\n";
- //System.out.println(replyHeader);
- return replyHeader;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement