From 5a81bd13fffefe7a0a61fc0f8fc00b3f2ef679fe Mon Sep 17 00:00:00 2001 From: Steven Tracey Date: Tue, 20 Jul 2021 00:30:58 -0400 Subject: [PATCH] Properly implemented internal webserver --- .../6.7/executionHistory/executionHistory.bin | Bin 100734 -> 100734 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/6.7/fileHashes/fileHashes.bin | Bin 20497 -> 21197 bytes .gradle/6.7/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .gradle/6.7/javaCompile/classAnalysis.bin | Bin 21140 -> 25222 bytes .gradle/6.7/javaCompile/javaCompile.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../compileJava/source-classes-mapping.txt | 24 ++- config.yml | 2 +- src/main/java/tech/nevets/lunarbot/Bot.java | 5 + .../{webapi => webserver}/WebAPI.java | 60 +----- .../nevets/lunarbot/webserver/WebServer.java | 200 ++++++++++++++++++ 12 files changed, 225 insertions(+), 66 deletions(-) rename src/main/java/tech/nevets/lunarbot/{webapi => webserver}/WebAPI.java (60%) create mode 100644 src/main/java/tech/nevets/lunarbot/webserver/WebServer.java diff --git a/.gradle/6.7/executionHistory/executionHistory.bin b/.gradle/6.7/executionHistory/executionHistory.bin index 67174aa43316314f550faf294a60a93a8f2925c3..49244850a28e67e06958c5edf7f684d49cfe21bc 100644 GIT binary patch delta 1390 zcmex2iS6Gcwh2<~jH;^`7&N3eDmF?mGwjUSyj0@c0!=-C1_nL<*~Td)Mmd?;sX3-e z6(va-NhUd&MFqxrRYsKz5U_o^f*Paic6l{M2Vq8$$sZ@nPk*4m$h*DAl2MIOC_&)M zRYUWAHCu(_)C^>vPGg)mol%}qbb5jeV=?1}=?4`UU8WnjF|u={C+4OWGcqm#Nz1W; zd3O=gYG8pF=lsk(=iC&%ti-ZJW`V#YE!T{DDq`0Xa)i64y?Mj95v*AltX3acEv88> znaQaLlNL7CBz|Yo)qA>P;r`I|VUJKvLRO1uQb1;2I>IESPqzew;$EgSsKnH=S~>Bd znuM(OD#CZXx%nxnMTsSu`FV_tE5V-NMhKlpC}c0s%+6$FTntvi3gX;BNUDPPF`jv8 z`3UD6hz&gwE^~H%Y)3+OyM^Ef#tmStoFJw8Af?;q*fN?kF`fn)*npB)xRF+!A z$T%OQP?QTUaviKf9nOylPfcQWgQn}9jHR$ws@MF*yVu*3#6kR?WJlZEub zPYsJdg|3j@Z~}{gC^~K;ybMitNFw00_Z*=@4JGYCZ9G21W(&iq+t=Uz_rJEo=;vxi zBn{vc2u`fq-?}q8F;Ac1%;<|qZH&`_apT7ckMijcT^W5f;9OYZgIY9~Np|<`4G9;7 zESI>>uS}ma{edf^pE!2aPp40GX7tfTk%T5csA*!;F3oO9lhm12n8g!oy26$bq6Lxu z5Gi)LrZ=OV!2KnizjiabesSBSE4ydWxpUiNlo>slSQ&xkXUyggn`~G%bG#{=3jkyo B@YetU delta 68 zcmV-K0K5PGk_P^g29O#D0J&@c05oB-A%PeJ0VS%lr5Mhj1~gCr05njOQI#PA2)~yx aPXSoBO-=zHGLxH38<*dQ0sFHl?Nyv3`xt=$ diff --git a/.gradle/6.7/executionHistory/executionHistory.lock b/.gradle/6.7/executionHistory/executionHistory.lock index a0a5af59647a7c68212527c3a9ffb29f8ebed51a..6e3d99f1311b1bec1791199c24d64115742a9976 100644 GIT binary patch literal 17 TcmZRU4>_TkAiO1+0RmhABs~K* literal 17 TcmZRU4>_TkAiO1+0Rl7uBq9SF diff --git a/.gradle/6.7/fileHashes/fileHashes.bin b/.gradle/6.7/fileHashes/fileHashes.bin index 30d62e5342909a339b754361cfdc6e1d7ea6f482..4609bf76e004ac1d911a8e8f158bc802909b9039 100644 GIT binary patch delta 1217 zcmbQZfbr~7#tkMCj%JOgEq5KAlV`vH27$K!p`fKA%d79g#t4YGM=?yiRUl=jl=ji- zQ1uHZyGmH{&towTo?3h#D#kszR3bxQp8d;ZNvuz0p@R97uS!@5tgu$8m^owFYKUME z>tt5R28|OJQ%z_1q+Wvv1}ukJb#iIl)=h`PK0w8tH`hu!Fbc>vasRWPG4nrEv~==T zsSF2~TN9k!;*UUG6*L=Wg!kI^+dRgvphgFo!^C|a#r>Q9O?V#E9hs9wr5iM|k4l*z z?lld92nJq;Db6Ws`>=Ye*i@*EHz)T>TL=_KFI(Q6(XtgPC^&hqv=bAn;zq?E;u{Tq z2yJ%s_{OY|An@g?q4~a=t-^6?1~N~lF)%Pz9nuxegJ@!l-5l;yz!+rtYvOv&ZH6WM z(Pg|k@dtl^Rq=>AK~xDH0MdHKKtdCU6+u{l@tctQE^G1MEbrf{wwLUC3Ncsg4NwvY zIDb!;^n1s0NLQR`GPl1Th`}}47Q*12obSJ=9@VtKBrVsBdn#hr5^{vQro920!dP|i z_bok$X{o9W0=PfTly~(=7p^xR)snDlxUJ z^;S-NP%V;BEg*lPX*m!ZdL&%t?EKh{gzk0=L0~cfI_vM_B8U!FU|^!_keIYI!0Om4 z4uRj5oRzm3fN2*L++trLI=CLdbkrk4a^@`q9q|O6)ul2rHUV>Xt$=C)#sLU$c>@VF zXR*YHZL*L)_^Dy>r_dF$8%{uV{03`a;1tKyaeRi&7KT%|ufP58e{F}+&(#d|V0Vc# zLbULBVQOjpD|hgNS>*ToMSZ`P%CvHVE#VP|MhR0UrjE{Yhjo2LzGgJ?-ufjopK%pb zhY7?EjxJ;!^^jEb(srHa(~Pi-e|UwzKl$k42G*i>z7wK_dn2+Ihz^SzOn)49z0>(@ zWqzK8`@&7I4(+v9Av&bBFm=pjlHGlKL&60i%O$S!E7RwIbvWvZ1LGeA7!!d6S^$ep fyEMBcO;Tr8VHQuU=?Yu07F}^Eum%PRC6EpPyM11s delta 220 zcmX@RlyTw$#tkMCj2e@DB_t=;Nf=B%CJ{f`R?=W{t7OGyT`3F3$+gl6lT~FZCZClt zm@F!5#l(DZqv8+ojRqbfn;kvAF)MsKB=TSbk9x^&gYD~<`UUN0U|_5|_`_bA0Ss7| zY!3G+U<@*`UTZ${T)4mfg^&ApNbcJRR`qSCI7Ahf6Oh(31`?V;tO&vaePNdZrfmJT zUV>Xfi*N6&rC=RDr450SK){(cS<>$v%fTOxJ0^4c>wy@TC)2m6X&pl1xHWN#XGj1EAOR$R1dsp{Kmter2_OL^fCP{L z5gMu!HH9bGUwb{%a?+jyngLE{}12bfjx^!>j#PJM}|c zADj8dEBAg^e-raxf0paNbQXB#3oq_qy61bYUp!FR))G9vhv{o}asBsO9*)UF%0i~E z?B@EVkwfZ8o`HtwX4LG{NW|0qN&m* zzbwfuinOB4m8Juax>17;qUk$W4gm#-{&tdnN<&J(PxLh1tya`V=q`;{nc^eV%dRV; znu@6qLvr~{C9IgOz3D@*F_nOkNUpe-Cg>Xi2ht^6(b9nu9oQIuuxmgzU62G;yUZWFrG?R&H?GHFn?FPfuU2KIV zkd+109Bf)Nf&V;~!XOZS0~@F2d`qKk%;?ngMyXW}1|&n3o5|E!St!^-^oka`gBkrc z4nELLJ>)YromNQv+|Ko1ZQb)^K#NqHtpU<*)9N~i0zwj6Azu3CY%TG+R(rrr5bb}LCj6?29-eynLA~kW zquo3PM!$E8}!QcGm5RI`sa0TjSHd-dli z`kbrgPG4iA@LL#xC#mJcC`>w?-~}X1Lu=w@ZLCh`fq0eF062mKkpKVy diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index b3f0ab70af1deef900c40b32c035abe6948ce267..5c1580a6d17763fb344bea5213a15c2223147d41 100644 GIT binary patch literal 17 UcmZSHc=v~%qbcVm1_;Oo05pdLQ~&?~ literal 17 UcmZSHc=v~%qbcVm1_WebAPI is running"); - out.flush(); - remote.close(); - } catch (Exception e) { - System.out.println("Error: " + e); - } - } - } + public static void webAPI() { } +} + diff --git a/src/main/java/tech/nevets/lunarbot/webserver/WebServer.java b/src/main/java/tech/nevets/lunarbot/webserver/WebServer.java new file mode 100644 index 0000000..d293e7b --- /dev/null +++ b/src/main/java/tech/nevets/lunarbot/webserver/WebServer.java @@ -0,0 +1,200 @@ +package tech.nevets.lunarbot.webserver; + + +import java.io.*; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.Date; +import java.util.StringTokenizer; + +public class WebServer implements Runnable { + + static final File WEB_ROOT = new File("."); + static final String DEFAULT_FILE = "index.html"; + static final String FILE_NOT_FOUND = "404.html"; + static final String METHOD_NOT_SUPPORTED = "mns.html"; + + static final int PORT = 80; + + private Socket connect; + public WebServer(Socket c) { + connect = c; + } + + public static void main(String[] args) { + try { + ServerSocket serverConnect = new ServerSocket(PORT); + while (true) { + WebServer myServer = new WebServer(serverConnect.accept()); + Thread thread = new Thread(myServer); + thread.start(); + } + } catch (IOException e) { + System.out.println("Error occurred while connecting"); + e.printStackTrace(); + } + } + + @Override + public void run() { + BufferedReader in = null; + PrintWriter out = null; + BufferedOutputStream dataOut = null; + String fileRequested = null; + + try { + in = new BufferedReader(new InputStreamReader(connect.getInputStream())); + out = new PrintWriter(connect.getOutputStream()); + dataOut = new BufferedOutputStream(connect.getOutputStream()); + String input = in.readLine(); + StringTokenizer parse = new StringTokenizer(input); + String method = parse.nextToken().toUpperCase(); + fileRequested = parse.nextToken().toLowerCase(); + + if (!method.equals("GET") && !method.equals("HEAD")) { + File file = new File(WEB_ROOT, METHOD_NOT_SUPPORTED); + int fileLength = (int) file.length(); + String contentMimeType = "text/html"; + byte[] fileData = readFileData(file, fileLength); + + out.println("HTTP/1.1 501 Not Implemented"); + out.println("Server: Java HTTP Server from SSaurel : 1.0"); + out.println("Date: " + new Date()); + out.println("Content-type: " + contentMimeType); + out.println("Content-length: " + fileLength); + out.println(); + out.flush(); + dataOut.write(fileData, 0, fileLength); + dataOut.flush(); + + } else { + if (fileRequested.endsWith("/")) { + fileRequested += DEFAULT_FILE; + } + + File file = new File(WEB_ROOT, fileRequested); + int fileLength = (int) file.length(); + String content = getContentType(fileRequested); + + if (method.equals("GET")) { + byte[] fileData = readFileData(file, fileLength); + + out.println("HTTP/1.1 200 OK"); + out.println("Server: Java HTTP Server from SSaurel : 1.0"); + out.println("Date: " + new Date()); + out.println("Content-type: " + content); + out.println("Content-length: " + fileLength); + out.println(); + out.flush(); + + dataOut.write(fileData, 0, fileLength); + dataOut.flush(); + } + } + + } catch (FileNotFoundException fnfe) { + try { + fileNotFound(out, dataOut, fileRequested); + } catch (IOException ioe) { + System.err.println("Error with file not found exception : " + ioe.getMessage()); + } + + } catch (IOException ioe) { + System.err.println("Server error : " + ioe); + } finally { + try { + in.close(); + out.close(); + dataOut.close(); + connect.close(); + } catch (Exception e) { + System.err.println("Error closing stream : " + e.getMessage()); + } + } + + + } + + private byte[] readFileData(File file, int fileLength) throws IOException { + FileInputStream fileIn = null; + byte[] fileData = new byte[fileLength]; + + try { + fileIn = new FileInputStream(file); + fileIn.read(fileData); + } finally { + if (fileIn != null) + fileIn.close(); + } + + return fileData; + } + + private String getContentType(String fileRequested) { + if (fileRequested.endsWith(".htm") || fileRequested.endsWith(".html")) + return "text/html"; + else + return "text/plain"; + } + + private void fileNotFound(PrintWriter out, OutputStream dataOut, String fileRequested) throws IOException { + File file = new File(WEB_ROOT, FILE_NOT_FOUND); + int fileLength = (int) file.length(); + String content = "text/html"; + byte[] fileData = readFileData(file, fileLength); + + out.println("HTTP/1.1 404 File Not Found"); + out.println("Server: Java HTTP Server from SSaurel : 1.0"); + out.println("Date: " + new Date()); + out.println("Content-type: " + content); + out.println("Content-length: " + fileLength); + out.println(); + out.flush(); + + dataOut.write(fileData, 0, fileLength); + dataOut.flush(); + } + + /** + protected void start() { + ServerSocket s; + + System.out.println("Webserver starting up on port 80"); + System.out.println("(press ctrl-c to exit)"); + try { + // create the main server socket + s = new ServerSocket(80); + } catch (Exception e) { + System.out.println("Error: " + e); + return; + } + + System.out.println("Waiting for connection"); + for (;;) { + try { + + Socket remote = s.accept(); + + System.out.println("Connection, sending data."); + BufferedReader in = new BufferedReader(new InputStreamReader( + remote.getInputStream())); + PrintWriter out = new PrintWriter(remote.getOutputStream()); + + String str = "."; + while (!str.equals("")) + str = in.readLine(); + + out.println("HTTP/1.0 200 OK"); + out.println("Content-Type: text/html"); + out.println("Server: Bot"); + out.println(""); + out.println("

WebAPI is running

"); + out.flush(); + remote.close(); + } catch (Exception e) { + System.out.println("Error: " + e); + } + } + } + **/ +}