-1

I this is my java HTTP server:

public class WebServer implements Runnable {
    public static final int PORT = 80;
    @Override
    public void run() {
        HttpServer $server;
        try {
            $server = HttpServer.create(new InetSocketAddress(80), 0);
        } catch (IOException _e) {
            throw new RuntimeException(_e);
        }
        $server.createContext("/", _httpExchange ->
        {
            String $uri = _httpExchange.getRequestURI().toString();
            $uri = $uri.startsWith("/") ? $uri.replaceFirst("/", "") : $uri;
            if ($uri.equals("")) {
                sendFile("test.html", _httpExchange);
            }
            else if ($uri.matches(".*\\.[^/.]+")) {
                sendFile($uri, _httpExchange);
            }
            else {
                sendFile($uri + ".html", _httpExchange);
            }
        });
        $server.start();
        System.out.println("Server started at " + getPrivateIp() + " on port " + PORT);
    }


    private static String getPrivateIp() {
        try (final DatagramSocket datagramSocket = new DatagramSocket()) {
            datagramSocket.connect(InetAddress.getByName("8.8.8.8"), 12345);
            return datagramSocket.getLocalAddress().getHostAddress();
        } catch (UnknownHostException | SocketException _e) {
            throw new RuntimeException(_e);
        }
    }
    public static void sendFile(String _name, HttpExchange _exchange) throws IOException {
        try {
            InputStream $stream = WebServer.class.getResourceAsStream(_name);
            if ($stream == null) {
                _exchange.sendResponseHeaders(404, 0);
                _exchange.close();
                return;
            }
            Scanner $scanner = new Scanner($stream).useDelimiter("\\A");
            String $response = $scanner.next();
            _exchange.getResponseBody();
            _exchange.sendResponseHeaders(200, $response.getBytes().length);
            _exchange.getResponseBody().write($response.getBytes());
            _exchange.close();
        } catch (Exception _ex) {
            throw new RuntimeException(_ex);
        }
    }
}

When I run it, and then open my website, everything is ok, but I cannot see any images. In the network tab, it says that the image was accepted, but it's not shown. I tried using Files.copy() in sendFile() method, but it didn't work - it didn't show the website, nor the image! (Not even when I did localhost/image.jpg).

In the network tab, it also shows that the MIME type is img/jpeg, which is correct, so it's not because of that...

Using wget, I get a normal looking .jpg file, but if I open it, it's corrupted...

Does someone know how to fix this? Thanks.

  • Are you passing correct image file paths? Try any cdn images for testing this out. – Kartikey Feb 03 '23 at 13:47
  • @Kartikey in the original code i have some `System.out.prinln()` log calls, and everything is how it's supposed to be. The String $response is also full of characters... – Sus Amongus Feb 03 '23 at 13:58

1 Answers1

0

Solved it!

You just check if the request wants .png or .jpg file (or you can just check the MIME type), and if it does, then you have to use ImageIO class

public static void sendFile(String _name, HttpExchange _exchange) {
        try {
            InputStream $stream = WebServer.class.getResourceAsStream(_name);
            if ($stream == null) {
                _exchange.sendResponseHeaders(404, 0);
                _exchange.close();
                return;
            }
            if (_name.matches(".*?\\.(png|PNG|jpg|JPG|jpeg|JPEG)")) {
                BufferedImage $image = ImageIO.read($stream);
                if (_name.toLowerCase().endsWith("png")) {
                    _exchange.sendResponseHeaders(200, getImageSize($image, "png"));
                    ImageIO.write($image, "png", _exchange.getResponseBody());
                }
                else {
                    _exchange.sendResponseHeaders(200, getImageSize($image,"jpeg"));
                    ImageIO.write($image, "jpeg", _exchange.getResponseBody());
                }
                $stream.close();
                _exchange.close();
                return;
            }
            Scanner $scanner = new Scanner($stream).useDelimiter("$");
            String $response = $scanner.next();
            _exchange.getResponseBody();
            _exchange.sendResponseHeaders(200, $response.length());
            _exchange.getResponseBody().write($response.getBytes());
            _exchange.close();
        } catch (Exception _ex) {
            throw new RuntimeException(_ex);
        }
    }
  • As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Feb 05 '23 at 19:56