package com.lfk.justweengine.utils.webServer; import com.lfk.justweengine.utils.webServer.Interface.OnPostData; import com.lfk.justweengine.utils.webServer.Interface.OnWebFileResult; import com.lfk.justweengine.utils.webServer.Interface.OnWebResult; import com.lfk.justweengine.utils.webServer.Interface.OnWebStringResult; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; import java.util.HashMap; /** * Solve request * * @author liufengkai * Created by liufengkai on 16/1/14. */ public class RequestSolve extends Thread { private Socket client; private BufferedReader clientReader; // url in link private String url; private HashMap<String, String> params; // private String urlName = ""; private int type; public RequestSolve(Socket s) { super(); this.client = s; } @Override public void run() { super.run(); try { clientReader = new BufferedReader( new InputStreamReader(client.getInputStream(), "UTF-8")); while (true) { String s = clientReader.readLine().trim(); if (s.equals("")) { break; } // Logger.e(s + '\n'); Servers.getLogResult().OnResult(s); int httpHeader = s.indexOf(" HTTP/"); switch (s.substring(0, 4)) { case "GET ": // get request link url = s.substring(4, httpHeader); Servers.getLogResult().OnResult("visiting" + url); break; case "POST": int last = s.indexOf('?'); params = new HashMap<>(); if (last > 0) { url = s.substring(5, last); getParams(s.substring(last + 1, httpHeader)); } else url = s.substring(5, httpHeader); break; } } } catch (IOException e) { e.printStackTrace(); Servers.getLogResult().OnError(e.getMessage()); } exeResult(url); } private void exeResult(String Url) { OnWebResult result = WebServer.getRule(Url); if (result != null) { if (result instanceof OnWebStringResult) { returnString(((OnWebStringResult) result).OnResult()); } else if (result instanceof OnWebFileResult) { returnFile(((OnWebFileResult) result).returnFile()); } else if (result instanceof OnPostData) { returnString(((OnPostData) result).OnPostData(params)); } } else { // 在新的权限管理之前,先允许所有服务器根目录下的文件访问 File file = new File(WebServerDefault.WebServerFiles + Url); if (file.exists()) { returnFile(file); } } } // private void findChildFile(String Url) { // int index = Url.lastIndexOf('/'); // if (index != -1) { // Log.d("index", Url.lastIndexOf('/') + ""); // // 仍能逐层递减 // if (index == 0) { // exeResult("/"); // urlName = "/" + urlName; // return; // } // // exeResult(Url.substring(0, index)); // urlName = Url.substring(index - 1) + urlName; // } // Logger.e("Url:" + Url.substring(0, Url.lastIndexOf('/'))); // Logger.e("UrlName:" + Url.substring(Url.lastIndexOf('/') + 1)); // } private void returnString(String str) { try { OutputStream o = client.getOutputStream(); o.write(setType(getHeaderBase(), str.length(), "200 OK").getBytes()); for (int i = 0; i < str.length(); i++) { o.write(str.charAt(i)); } o.close(); client.close(); } catch (IOException e) { e.printStackTrace(); } } private void returnFile(File file) { if (file.exists()) { try { BufferedInputStream inputStream = new BufferedInputStream( new FileInputStream(file)); BufferedOutputStream out = new BufferedOutputStream(client.getOutputStream()); ByteArrayOutputStream tempOut = new ByteArrayOutputStream(); byte[] buf = new byte[4096]; int count; while ((count = inputStream.read(buf)) != -1) { tempOut.write(buf, 0, count); } tempOut.flush(); out.write(setType(getHeaderBase(), tempOut.size(), "200 OK").getBytes()); out.write(tempOut.toByteArray()); out.flush(); client.close(); } catch (IOException e) { e.printStackTrace(); } } } private void getParams(String url) { int valueFirst; for (String s : url.split("&")) { valueFirst = s.indexOf("="); params.put(s.substring(0, valueFirst), s.substring(valueFirst + 1)); } } private String getHeaderBase() { return "HTTP/1.1 %code%\n" + "Server: JustWe_WebServer/0.1\n" + "Content-Length: %length%\n" + "Connection: close\n" + "Content-Type: text/html; charset=iso-8859-1\n\n"; } private String setType(String str, double length, String TYPE) { str = str.replace("%code%", TYPE); str = str.replace("%length%", "" + length); return str; } }