package name.admitriev.jhelper.network; import com.intellij.notification.NotificationType; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.util.Consumer; import name.admitriev.jhelper.ui.Notificator; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; /** * Simple HTTP Server. * Passes every request without headers to given Consumer */ public class SimpleHttpServer implements Runnable { private Consumer<String> consumer; private ServerSocket serverSocket = null; public SimpleHttpServer(int port, Consumer<String> consumer) throws IOException { serverSocket = new ServerSocket(port); this.consumer = consumer; } @Override public void run() { while (true) { try { if (serverSocket.isClosed()) { return; } try (Socket socket = serverSocket.accept()) { InputStream inputStream = socket.getInputStream(); String request = readFromStream(inputStream); String[] strings = request.split("\n\n", 2); //ignore headers if (strings.length < 2) { Notificator.showNotification( "ChromeParser", "Got response without body. Ignore.", NotificationType.INFORMATION ); continue; } String text = strings[1]; ApplicationManager.getApplication().invokeLater( () -> consumer.consume(text), ModalityState.defaultModalityState() ); } } catch (IOException ignored) { } } } private static String readFromStream(InputStream inputStream) throws IOException { try (BufferedReader reader = new BufferedReader( new InputStreamReader(inputStream, "UTF-8") )) { StringBuilder builder = new StringBuilder(); String line; //noinspection NestedAssignment while ((line = reader.readLine()) != null) builder.append(line).append('\n'); return builder.toString(); } } public void stop() { try { serverSocket.close(); } catch (IOException ignored) { } } }