in browser/src/main/java/org/netbeans/html/presenters/browser/Browser.java [347:462]
public <Request, Response> void service(HttpServer<Request, Response, ?, ?> server, Request rqst, Response rspns) throws IOException {
String path = server.getRequestURI(rqst);
cors(server, rspns);
if ("OPTIONS".equals(server.getMethod(rqst))) { // NOI18N
server.setStatus(rspns, 204);
server.addHeader(rspns, "Allow", "OPTIONS, GET, HEAD, POST, PUT"); // NOI18N
return;
}
if ("/".equals(path) || "index.html".equals(path)) {
Reader is;
String prefix = "http://" + server.getServerName(rqst) + ":" + server.getServerPort(rqst) + "/";
Writer w = server.getWriter(rspns);
server.setContentType(rspns, "text/html");
final Command cmd = new Command(server, Browser.this, prefix);
try {
is = new InputStreamReader(page.openStream());
} catch (IOException ex) {
w.write("<html><body>");
w.write("<h1>Browser</h1>");
w.write("<pre id='cmd'></pre>");
emitScript(w, prefix, cmd.id);
w.write("</body></html>");
w.close();
return;
}
SESSIONS.put(cmd.id, cmd);
int state = 0;
for (;;) {
int ch = is.read();
if (ch == -1) {
break;
}
char lower = Character.toLowerCase((char)ch);
switch (state) {
case 1000: break;
case 0: if (lower == '<') state = 1; break;
case 1: if (lower == 'b') state = 2;
else if (lower != ' ' && lower != '\n') state = 0;
break;
case 2: if (lower == 'o') state = 3; else state = 0; break;
case 3: if (lower == 'd') state = 4; else state = 0; break;
case 4: if (lower == 'y') state = 5; else state = 0; break;
case 5: if (lower == '>') state = 500;
else if (lower != ' ' && lower != '\n') state = 0;
break;
}
w.write((char)ch);
if (state == 500) {
emitScript(w, prefix, cmd.id);
state = 1000;
}
}
if (state != 1000) {
emitScript(w, prefix, cmd.id);
}
is.close();
w.close();
} else if (path.equals("/command.js")) {
String id = server.getParameter(rqst, "id");
Command c = SESSIONS.get(id);
if (c == null) {
server.getWriter(rspns).write("No command for " + id);
server.setStatus(rspns, 404);
return;
}
c.service(rqst, rspns);
} else {
if (path.startsWith("/")) {
path = path.substring(1);
}
URL relative = new URL(page, path);
InputStream is;
URLConnection conn;
try {
conn = relative.openConnection();
is = conn.getInputStream();
} catch (FileNotFoundException ex) {
server.setStatus(rspns, 404);
return;
}
String found = null;
if (relative.getProtocol().equals("file")) {
try {
File file = new File(relative.toURI());
found = Files.probeContentType(file.toPath());
} catch (URISyntaxException | IOException ignore) {
}
} else {
found = conn.getContentType();
}
if (found == null || "content/unknown".equals(found)) {
if (path.endsWith(".html")) {
found = "text/html";
}
if (path.endsWith(".js")) {
found = "text/javascript";
}
if (path.endsWith(".css")) {
found = "text/css";
}
}
if (found != null) {
server.setContentType(rspns, found);
}
OutputStream out = server.getOutputStream(rspns);
for (;;) {
int b = is.read();
if (b == -1) {
break;
}
out.write(b);
}
out.close();
is.close();
}
}