#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
use t::APISIX 'no_plan';

repeat_each(1);
no_long_string();
no_root_location();
log_level("info");

add_block_preprocessor(sub {
    my ($block) = @_;

    $block;
});

run_tests;

__DATA__

=== TEST 1: add route to HTTPS upstream
--- config
    location /t {
        content_by_lua_block {
            local t = require("lib.test_admin").test
            local code, body = t('/apisix/admin/routes/1',
                ngx.HTTP_PUT,
                [[{
                    "methods": ["GET"],
                    "upstream": {
                        "scheme": "https",
                        "type": "roundrobin",
                        "nodes": {
                            "127.0.0.1:1983": 1
                        }
                    },
                    "uri": "/hello"
                }]]
                )

            if code >= 300 then
                ngx.status = code
            end
            ngx.say(body)
        }
    }
--- request
GET /t
--- response_body
passed



=== TEST 2: hit the upstream
--- request
GET /hello
--- more_headers
host: www.sni.com
--- error_log
Receive SNI: www.sni.com



=== TEST 3: use 443 as the default port
--- apisix_yaml
routes:
  -
    uri: /hello
    upstream:
        scheme: https
        nodes:
            "127.0.0.1": 1
        type: roundrobin
#END
--- request
GET /hello
--- error_code: 502
--- error_log
upstream: "https://127.0.0.1:443/hello"



=== TEST 4: use 80 as the http's default port
--- apisix_yaml
routes:
  -
    uri: /hello
    upstream:
        nodes:
            "127.0.0.1": 1
        type: roundrobin
#END
--- request
GET /hello
--- error_code: 502
--- error_log
upstream: "http://127.0.0.1:80/hello"



=== TEST 5: rewrite SNI
--- log_level: debug
--- apisix_yaml
routes:
  -
    uri: /uri
    upstream:
        scheme: https
        nodes:
            "127.0.0.1:1983": 1
        type: roundrobin
        pass_host: "rewrite"
        upstream_host: "www.test.com"
#END
--- request
GET /uri
--- more_headers
host: www.sni.com
--- error_log
Receive SNI: www.test.com
--- response_body
uri: /uri
host: www.test.com
x-real-ip: 127.0.0.1



=== TEST 6: node's SNI
--- log_level: debug
--- apisix_yaml
routes:
  -
    uri: /uri
    upstream:
        scheme: https
        nodes:
            "localhost:1983": 1
        type: roundrobin
        pass_host: "node"
#END
--- request
GET /uri
--- more_headers
host: www.sni.com
--- error_log
Receive SNI: localhost
--- response_body
uri: /uri
host: localhost:1983
x-real-ip: 127.0.0.1
