//
//  ========================================================================
//  Copyright (c) 1995-2022 Mort Bay Consulting Pty Ltd and others.
//  ------------------------------------------------------------------------
//  All rights reserved. This program and the accompanying materials
//  are made available under the terms of the Eclipse Public License v1.0
//  and Apache License v2.0 which accompanies this distribution.
//
//      The Eclipse Public License is available at
//      http://www.eclipse.org/legal/epl-v10.html
//
//      The Apache License v2.0 is available at
//      http://www.opensource.org/licenses/apache2.0.php
//
//  You may elect to redistribute this code under either of these licenses.
//  ========================================================================
//

package org.eclipse.jetty.fcgi;

public class FCGI
{
    private FCGI()
    {
    }

    public enum Role
    {
        RESPONDER(1), AUTHORIZER(2), FILTER(3);

        public static Role from(int code)
        {
            switch (code)
            {
                case 1:
                    return RESPONDER;
                case 2:
                    return AUTHORIZER;
                case 3:
                    return FILTER;
                default:
                    throw new IllegalArgumentException();
            }
        }

        public final int code;

        Role(int code)
        {
            this.code = code;
        }
    }

    public enum FrameType
    {
        BEGIN_REQUEST(1),
        ABORT_REQUEST(2),
        END_REQUEST(3),
        PARAMS(4),
        STDIN(5),
        STDOUT(6),
        STDERR(7),
        DATA(8),
        GET_VALUES(9),
        GET_VALUES_RESULT(10);

        public static FrameType from(int code)
        {
            switch (code)
            {
                case 1:
                    return BEGIN_REQUEST;
                case 2:
                    return ABORT_REQUEST;
                case 3:
                    return END_REQUEST;
                case 4:
                    return PARAMS;
                case 5:
                    return STDIN;
                case 6:
                    return STDOUT;
                case 7:
                    return STDERR;
                case 8:
                    return DATA;
                case 9:
                    return GET_VALUES;
                case 10:
                    return GET_VALUES_RESULT;
                default:
                    throw new IllegalArgumentException();
            }
        }

        public final int code;

        FrameType(int code)
        {
            this.code = code;
        }
    }

    public enum StreamType
    {
        STD_IN, STD_OUT, STD_ERR
    }

    public static class Headers
    {
        public static final String AUTH_TYPE = "AUTH_TYPE";
        public static final String CONTENT_LENGTH = "CONTENT_LENGTH";
        public static final String CONTENT_TYPE = "CONTENT_TYPE";
        public static final String DOCUMENT_ROOT = "DOCUMENT_ROOT";
        public static final String DOCUMENT_URI = "DOCUMENT_URI";
        public static final String GATEWAY_INTERFACE = "GATEWAY_INTERFACE";
        public static final String HTTPS = "HTTPS";
        public static final String PATH_INFO = "PATH_INFO";
        public static final String QUERY_STRING = "QUERY_STRING";
        public static final String REMOTE_ADDR = "REMOTE_ADDR";
        public static final String REMOTE_PORT = "REMOTE_PORT";
        public static final String REQUEST_METHOD = "REQUEST_METHOD";
        public static final String REQUEST_URI = "REQUEST_URI";
        public static final String SCRIPT_FILENAME = "SCRIPT_FILENAME";
        public static final String SCRIPT_NAME = "SCRIPT_NAME";
        public static final String SERVER_ADDR = "SERVER_ADDR";
        public static final String SERVER_NAME = "SERVER_NAME";
        public static final String SERVER_PORT = "SERVER_PORT";
        public static final String SERVER_PROTOCOL = "SERVER_PROTOCOL";
        public static final String SERVER_SOFTWARE = "SERVER_SOFTWARE";

        private Headers()
        {
        }
    }
}
