-
Notifications
You must be signed in to change notification settings - Fork 0
/
WebServer.java
executable file
·149 lines (123 loc) · 3.28 KB
/
WebServer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import java.io.*;
import java.net.* ;
import java.util.* ;
public final class WebServer
{
public static void main(String argv[]) throws Exception
{
int port = Integer.parseInt(argv[0]);
System.out.println("Port: " + port);
ServerSocket socket;
try{
socket = new ServerSocket(port);
Socket conn;
while(true){
conn = socket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
//System.out.println(in.readLine());
if(in.ready()){
HttpRequest request = new HttpRequest(conn);
Thread thread = new Thread(request);
thread.start();
}
// in.close();
}
}catch(UnknownHostException e){
System.out.println(e);
}
}
}
final class HttpRequest implements Runnable
{
final static String CRLF = "\r\n";
Socket socket;
//http constructor
public HttpRequest(Socket socket) throws Exception
{
this.socket = socket;
}
//run
public void run()
{
try{
processRequest();
}catch(Exception e){
System.out.println(e);
}
}
private void processRequest() throws Exception
{
InputStream is = socket.getInputStream();
DataOutputStream os = new DataOutputStream(socket.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//Client message
String requestLine = br.readLine();
System.out.println(requestLine);
String headerLine = null;
while((headerLine = br.readLine()).length() != 0){
System.out.println(headerLine);
}
StringTokenizer tokens = new StringTokenizer(requestLine);
tokens.nextToken();
String fileName = tokens.nextToken();
fileName = "." + fileName;
FileInputStream fis = null;
boolean fileExists = true;
try{
fis = new FileInputStream(fileName);
}catch(FileNotFoundException e){
fileExists = false;
}
//Construct response
String statusLine = null;
String contentTypeLine = null;
String entityBody = null;
if(fileExists){
statusLine = "200 OK";
contentTypeLine = "Content-type: " + contentType(fileName) + CRLF;
}else{
statusLine = "404 Not Found";
contentTypeLine = "text/html" + CRLF;
entityBody = "<html><head><title>404 File Not Found</title></head><body><h1>404!</h1><p>The file was not found on the server!</p></body></html>";
}
//Send the status line
os.writeBytes("HTTP/1.0 " + statusLine);
//Send the content type
os.writeBytes(contentTypeLine);
//Send a blank line to ind. the end of header lines
os.writeBytes(CRLF);
//Send file
if(fileExists){
sendBytes(fis, os);
fis.close();
}else{
os.writeBytes(entityBody);
}
os.close();
br.close();
// socket.close();
}
private static void sendBytes(FileInputStream fis, OutputStream os) throws Exception
{
//Construct 1K buffer to hold bytes on way out of socket
byte[] buffer = new byte[1024];
int bytes = 0;
//Copy requested file into the socket's output stream
while((bytes = fis.read(buffer)) != -1){
os.write(buffer, 0, bytes);
}
}
private static String contentType(String fileName)
{
if(fileName.matches(".html?$")){
return "text/html";
}else if(fileName.matches(".gif$")){
return "image/gif";
}else if(fileName.matches(".jpe?g$")){
return "image/jpeg";
}else if(fileName.matches(".png$")){
return "image/png";
}
return "application/octet-stream";
}
}