/*
 * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */


import java.net.Socket;

/**
 * Implementation of HTTP proxy server.
 *
 */
public class HttpProxyServer extends AbstractHttpSockServer {

    public static final int DEFAULT_PORT = 8080;

    private String externalHttpProxyHost = null;

    private int externalHttpProxyPort = -1;

    public HttpProxyServer() {
        super(DEFAULT_PORT);
    }

    public HttpProxyServer(int port) {
        super(port);
    }

    public HttpProxyServer(int port, String externalHttpProxyHost, int externalHttpProxyPort) {
        super(port);
        this.externalHttpProxyHost = externalHttpProxyHost;
        this.externalHttpProxyPort = externalHttpProxyPort;
    }

    @Override
    protected Runnable createClientConnectionHandler(Socket socket) {
        HttpConnectionHandler httpConnectionHandler = new HttpConnectionHandler(socket);
        httpConnectionHandler.setExternalHttpProxy(externalHttpProxyHost, externalHttpProxyPort);

        httpConnectionHandler.setConnectionCheckers(getConnectionCheckers());
        httpConnectionHandler.setDataCheckers(getDataCheckers());
        httpConnectionHandler.setDelay(delay);

        return httpConnectionHandler;
    }

    private boolean usingProxy() {
        return externalHttpProxyHost != null && externalHttpProxyPort > 0;
    }

    @Override
    protected void printStartMessage() {
        System.out.println("HTTP proxy server has been started on " + getPort() + " port");
        if (usingProxy()) {
            System.out.println("Use external HTTP proxy " + externalHttpProxyHost + ":" + externalHttpProxyPort);
        } else {
            System.out.println("No external HTTP proxy");
        }
    }

}
