-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHttpServer.java
173 lines (154 loc) · 5.81 KB
/
HttpServer.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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/**
* Simple HTTP server
*/
class Request {
private String type;
private String uri;
private String protocol;
public Request(String type, String uri, String protocol) {
this.type = type;
this.uri = uri;
this.protocol = protocol;
}
public void log() {
System.out.print(this.type);
System.out.print(" ");
System.out.print(this.uri);
System.out.print(" ");
System.out.print(this.protocol);
System.out.println("");
}
public String getUri() {
return uri;
}
}
class HServer {
private int portNumber;
private FileInputStream is;
private FileOutputStream os;
private String folder;
public HServer(int portNumber, String folder) {
this.portNumber = portNumber;
this.folder = folder;
}
/**
* This is a helper function because comparing with `\n` does not work
*/
public static boolean isLR(char c) {
String s = "\n";
return s.indexOf(c) >= 0;
}
public void start() {
ServerSocket serverSocket = new ServerSocket(this.portNumber);
int s = 0;
while (s == 0) {
Socket clientSocket = serverSocket.accept();
this.is = clientSocket.getInputStream();
this.os = clientSocket.getOutputStream();
Request req = handle_request();
req.log();
handle_response(req);
// clientSocket.close();
}
serverSocket.close();
}
int fileSize(String filename) {
int l = 1;
int file_size = 0;
char[] buffer = new char[1024];
FileInputStream file = FileInputStream.open(filename);
if (!file.getFD().valid()) {
return 0;
}
while (l > 0) {
l = file.read(buffer);
file_size += l;
}
file.close();
return file_size;
}
void printFile(String filename, int buff_size) {
if (buff_size <= 0) {
return;
}
int l = 1;
String s;
char[] buffer = new char[buff_size];
char[] sub_buffer;
FileInputStream file = FileInputStream.open(filename);
while (l > 0) {
l = file.read(buffer);
sub_buffer = System.arraycopy(buffer, l);
s = new String(sub_buffer);
this.os.print(s);
}
file.close();
}
private void handle_response(Request request) {
// Print headers
this.os.println("HTTP/1.0 200 OK");
// this.os.println("Content-Type: text/html; charset=UTF-8");
this.os.println("Server: JavabienHTTPServer");
String filename = String.concat(this.folder, request.getUri());
int fs = this.fileSize(filename);
String contentLen = String.concat("Content-Length: ", String.fromInteger(fs));
this.os.println(contentLen);
if (fs > 2048) {
fs = 2018;
}
this.os.println("Connection: close");
this.os.println("");
// Print content
this.printFile(filename, fs);
}
private Request handle_request() {
String s;
char[] buffer = new char[256];
char[] req_type = new char[5];
char[] req_uri = new char[200];
char[] req_pro = new char[20];
int i = 0;
int offset = 0;
this.is.read(buffer);
// Get request type
for (i = 0; buffer[i] != ' '; i++) {
req_type[i] = buffer[i];
}
req_type = System.arraycopy(req_type, i);
i++; // Skip space
// Get request uri
offset = i;
for (; buffer[i] != ' '; i++) {
req_uri[i - offset] = buffer[i];
}
req_uri = System.arraycopy(req_uri, i-offset);
i++; // Skip space
// Get request protocol
offset = i;
for (; buffer[i] != ' ' && !HServer.isLR(buffer[i]); i++) {
req_pro[i - offset] = buffer[i];
}
req_pro = System.arraycopy(req_pro, i-offset);
Request req = new Request(
new String(req_type),
new String(req_uri),
new String(req_pro)
);
// Skip two spaces
for (; !HServer.isLR(buffer[i]) && !HServer.isLR(buffer[i+1]); i++) {}
return req;
}
}
class HttpServer {
public static void main(String[] args) {
System.initializeSystemClass(); // Mandatory call
if (args.length < 2) {
System.out.println("Usage: HttpServer <listen_port> <served_folder>");
return;
}
int portNumber = Integer.parseInt(args[0]);
String folder = args[1];
HServer server = new HServer(portNumber, folder);
server.start();
}
}