This repository has been archived by the owner on Aug 9, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHttpResponse.java
150 lines (146 loc) · 4.09 KB
/
HttpResponse.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
import java.io.* ;
import java.net.* ;
import java.util.* ;
import com.google.gson.*;
class HttpResponse {
final static String CRLF = "\r\n";
DataOutputStream os;
int statuscode;
String statusmsg;
Map<String, String> headers;
Template bodyTemplate;
FileInputStream bodyFis;
String bodyString;
public HttpResponse(Socket socket) throws IOException {
final DataOutputStream os = new DataOutputStream(socket.getOutputStream());
this.os = os;
headers = new HashMap<String, String>();
setStatus(200, "OK");
setHeader("Server", "lucos");
}
public void setHeader(String key, String value) {
headers.put(key, value);
}
public void setFileName(String fileName) {
setHeader("Content-type", contentType(fileName));
}
private void clearBody() {
bodyFis = null;
bodyTemplate = null;
bodyString = null;
}
private void setStatus(int statuscode, String statusmsg) {
this.statuscode = statuscode;
this.statusmsg = statusmsg;
}
public void setBody(Template template) {
clearBody();
bodyTemplate = template;
setFileName(template.getFileName());
}
public void setBody(FileInputStream fis) {
clearBody();
bodyFis = fis;
}
private void setBody(String string) {
clearBody();
bodyString = string;
setHeader("Content-type", "text/plain");
}
public void setError(int statuscode, String errormsg) {
setStatus(statuscode, errormsg);
try {
Template errorTemplate = new Template("error", "html");
errorTemplate.setData("errormsg", errormsg);
setBody(errorTemplate);
} catch (IOException e) {
setBody(errormsg);
}
}
public void redirect(String url, int statuscode) {
if (statuscode < 300 || statuscode >= 400) {
Manager.logErr("Invalid redirect status code: "+statuscode+". Must be in the 3xx range");
redirect(url);
return;
}
clearBody();
setStatus(statuscode, "Redirect");
setHeader("Location", url);
}
public void redirect(String url) {
redirect(url, 302);
}
public void notFound(String type) {
String msg = type + " Not Found";
setError(404, msg);
}
public void notFound() {
notFound("File");
}
public void setJson(Object output) {
clearBody();
Gson gson = new Gson();
bodyString = gson.toJson(output);
setHeader("Content-type", "application/json");
}
private static String contentType(String fileName) {
if(fileName.endsWith(".htm") || fileName.endsWith(".html")) {
return "text/html";
}
if(fileName.endsWith(".xhtml")) {
return "application/xhtml+xml";
}
if(fileName.endsWith(".png")) {
return "image/png";
}
if(fileName.endsWith(".gif")) {
return "image/gif";
}
if(fileName.endsWith(".jpg")) {
return "image/jpeg";
}
if(fileName.endsWith(".css")) {
return "text/css";
}
if(fileName.endsWith(".js")) {
return "text/javascript";
}
if(fileName.endsWith(".mp3")) {
return "audio/mpeg";
}
if(fileName.endsWith("manifest")) {
return "text/cache-manifest";
}
if(fileName.endsWith("ico")) {
return "image/x-icon";
}
return "application/octet-stream";
}
private void sendHeaders() throws IOException {
os.writeBytes("HTTP/1.1 "+ statuscode +" "+ statusmsg + CRLF);
Iterator iter = headers.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry header = (Map.Entry)iter.next();
os.writeBytes(header.getKey()+": "+header.getValue() + CRLF);
}
os.writeBytes(CRLF);
}
public void send() throws IOException {
sendHeaders();
if (bodyTemplate != null) {
os.writeBytes(bodyTemplate.toString());
} else if (bodyString != null) {
os.writeBytes(bodyString);
} else if (bodyFis != null) {
// Construct a 1K buffer to hold bytes on their way to the socket.
byte[] buffer = new byte[1024];
int bytes = 0;
// Copy requested file into the socket's output stream.
while((bytes = bodyFis.read(buffer)) != -1 ) {
os.write(buffer, 0, bytes);
}
bodyFis.close();
}
os.close();
}
}