/*
 * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package test;

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.net.*;
import java.io.*;
public class FilterTest implements Filter{

    private ServletContext context;
    private static boolean DEFAULT_REUSE_ADDRESS;
    private static int DEFAULT_RECEIVE_BUFFER_SIZE;
    private static int DEFAULT_SEND_BUFFER_SIZE;
    private static int DEFAULT_TRAFFIC_CLASS;
    private static boolean DEFAULT_KEEP_ALIVE;
    private static boolean DEFAULT_OOB_INLINE;
    private static int DEFAULT_SO_LINGER;
    private static boolean DEFAULT_TCP_NO_DELAY;

    private static final int PORT = 7007;
    private static final String HOST = "localhost";

    private static boolean tested = false;


    public void destroy() {
        System.out.println("[Filter.destroy]");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws java.io.IOException, jakarta.servlet.ServletException {
        System.out.println("[Filter.doFilter]");

        try {
        java.net.Socket socket = new java.net.Socket();
         DEFAULT_REUSE_ADDRESS = socket.getReuseAddress();
         DEFAULT_RECEIVE_BUFFER_SIZE = socket.getReceiveBufferSize();
         DEFAULT_SEND_BUFFER_SIZE = socket.getSendBufferSize();
         DEFAULT_KEEP_ALIVE = socket.getKeepAlive();
         DEFAULT_OOB_INLINE = socket.getOOBInline();
         DEFAULT_SO_LINGER = socket.getSoLinger();
         DEFAULT_TCP_NO_DELAY = socket.getTcpNoDelay();
         DEFAULT_TRAFFIC_CLASS = socket.getTrafficClass();
         socket.setReceiveBufferSize(DEFAULT_RECEIVE_BUFFER_SIZE);
         socket.setSendBufferSize(DEFAULT_SEND_BUFFER_SIZE);

         if (tested == false) {
             test();
             tested = true;
         }
       }catch (Exception e) {
         e.printStackTrace();
         throw new ServletException(e.getMessage());
       }

       System.out.println("PROCEEDING WITH THE TEST");

        ((HttpServletRequest)request).getSession().setAttribute("FILTER", "PASS");
        filterChain.doFilter(request, response);

    }


    public void init(jakarta.servlet.FilterConfig filterConfig) throws jakarta.servlet.ServletException {
        System.out.println("[Filter.init]");
        context = filterConfig.getServletContext();
    }


    public void test() {
        InetSocketAddress isa;
        try {
            isa = new InetSocketAddress(InetAddress.getByName(HOST), PORT);
        } catch (UnknownHostException ex) {
            ex.printStackTrace();
            throw new RuntimeException (ex);
        }
        Socket s = new Socket();
        try {
            s.connect(isa, 1000);
            testSocketConnection();
            InputStream is = s.getInputStream();
            OutputStream os = s.getOutputStream();
            int count = 1;
            while (true){
                int available = is.available();
                if (available > 0 || count == 6 || count > 10) {
                    if (count == 6) {
                        try {
                            s.setSoTimeout(3000);
                            System.out.println("Blocking call...");
                            is.read();
                            throw new RuntimeException("Should have timed out");
                        } catch (java.net.SocketTimeoutException ie) {
                            System.out.println("Expected exception");
                            ie.printStackTrace();
                        }
                        os.write(count++);
                    }
                    int i = is.read();
                    System.out.println(i);
                    if (count != i && count < 11 ) throw new RuntimeException("Wrong Data, Expected : " + count + " Got: "+ i);
                    os.write(count++);
                } else {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        } catch (IOException ex) {
            if (ex instanceof java.net.SocketException) {
                System.out.println("Expected Exception");
                ex.printStackTrace();
                return;
            } else {
                throw new RuntimeException(ex);
            }
        } finally {
            try {
                s.close();
            } catch (IOException ex) {
                throw new RuntimeException("Close Failed");
            }
        }
    }

    private void testSocketConnection() {
        try {
            Socket s1 = new Socket(InetAddress.getByName(HOST), PORT);
            System.out.println("Local :" + s1.getLocalSocketAddress());
            s1.close();
            Socket s2 = new Socket(InetAddress.getByName(HOST), PORT, false);
            System.out.println("Local:" + s2.getLocalSocketAddress());
            s2.close();
            Socket s3 = new Socket(InetAddress.getByName(HOST), PORT, InetAddress.getByName(HOST), 8600);
            System.out.println("Remote:" + s3.getRemoteSocketAddress());
            s3.close();
            Socket s4 = new Socket(Proxy.NO_PROXY);
            s4.connect(new InetSocketAddress(HOST, PORT));
            System.out.println("Remote: " + s4.getRemoteSocketAddress());
            s4.close();
            Socket s5 = new Socket(HOST, PORT);
            System.out.println("Local:" + s5.getLocalSocketAddress());
            s5.close();
            Socket s6 = new Socket();
            s6.bind(null);
            System.out.println("Local:" + s6.getLocalSocketAddress());
            s6.close();
            try {
                Socket s7 = new Socket(HOST, PORT + 1);
            } catch (Exception e) {
                e.printStackTrace();
            }
            Socket s = new Socket();
            int rsize = s.getReceiveBufferSize();
            s.setReceiveBufferSize(1000);
            s.connect(new InetSocketAddress(InetAddress.getByName(HOST), PORT));
            if (s.getChannel() != null ) throw new RuntimeException ("Channel not null");
            if (s.getInetAddress().equals(InetAddress.getByName(HOST)) == false ) throw new RuntimeException("Not connected to local address");
            boolean b = s.getKeepAlive();
            s.setKeepAlive(! b);
            if (s.getKeepAlive() == b) throw new RuntimeException("Keep alive is not set");
            if (s.getLocalAddress().equals(InetAddress.getByName(HOST)) == false ) throw new RuntimeException("Not connected to local address");
            System.out.println("Port : " + s.getLocalPort());
            System.out.println("Port : " + s.getLocalSocketAddress());
            System.out.println("Port : " + s.getPort());
            b = s.getOOBInline();
            s.setOOBInline(! b);
            if (s.getOOBInline() == b) throw new RuntimeException("OOB not set");
            s.setPerformancePreferences(1000, 100, 100);

            int bs = s.getReceiveBufferSize();
            if (bs == rsize ) throw new RuntimeException("RBS not set : " + bs);
            b = s.getReuseAddress();
            s.setReuseAddress(!b);
            if (s.getReuseAddress() == b) throw new RuntimeException("ReuseADDR not set");
            int i = s.getSoLinger();
            if (i != -1 ) {
                s.setSoLinger(false, 0);
                if (s.getSoLinger() != -1) throw new RuntimeException("Linger not set");
            } else {
                s.setSoLinger(true, 1000);
                if (s.getSoLinger() != 1000) throw new RuntimeException("Linger not set");
            }
            s.setSoTimeout(1000);
            if (s.getSoTimeout() != 1000 ) throw new RuntimeException("TIMEOUT not SET");

            b = s.getTcpNoDelay();
            s.setTcpNoDelay(! b);

            if (s.getTcpNoDelay() == b) throw new RuntimeException("TCP NO DELAT not SET");
            i = s.getTrafficClass();


            int j = i +5;
            if (j > 250) j = i -5;
            int k = s.getTrafficClass();
            s.setTrafficClass(j);
            int tc = s.getTrafficClass();
            if (tc == k) throw new RuntimeException("TC not set: " + tc);

            s.setSendBufferSize(1000);
            s.getSendBufferSize();
        } catch (RuntimeException e){
            throw e;
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException("Unwanted exceprtion");

        }

    }
}
