diff --git a/kong/templates/nginx_kong.lua b/kong/templates/nginx_kong.lua index a8ec37ef153f..fbdbc7a1cb69 100644 --- a/kong/templates/nginx_kong.lua +++ b/kong/templates/nginx_kong.lua @@ -63,6 +63,16 @@ upstream kong_upstream { keepalive ${{UPSTREAM_KEEPALIVE}}; } +map $http_upgrade $upstream_connection { + default keep-alive; + websocket upgrade; +} + +map $http_upgrade $upstream_upgrade { + default ''; + websocket websocket; +} + server { server_name kong; listen ${{PROXY_LISTEN}}; @@ -89,10 +99,13 @@ server { kong.access() } + proxy_http_version 1.1; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $upstream_host; + proxy_set_header Upgrade $upstream_upgrade; + proxy_set_header Connection $upstream_connection; proxy_pass_header Server; proxy_pass $upstream_url; diff --git a/spec/02-integration/05-proxy/04-websockets_spec.lua b/spec/02-integration/05-proxy/04-websockets_spec.lua new file mode 100644 index 000000000000..d9dfaf371f4a --- /dev/null +++ b/spec/02-integration/05-proxy/04-websockets_spec.lua @@ -0,0 +1,44 @@ +local client = require "resty.websocket.client" +local helpers = require "spec.helpers" +local cjson = require "cjson" + +describe("Websockets", function() + setup(function() + assert(helpers.start_kong()) + + assert(helpers.dao.apis:insert { + request_path = "/ws", + strip_request_path = true, + upstream_url = "http://sockb.in" + }) + end) + + teardown(function() + helpers.stop_kong() + end) + + local function make_request(uri) + local wb = assert(client:new()) + assert(wb:connect(uri)) + assert(wb:send_text("testing Kong")) + + local data = assert(wb:recv_frame()) + assert.equal("testing Kong", cjson.decode(data).reqData) + + assert(wb:send_close()) + + return true + end + + it("works without Kong", function() + assert(make_request("ws://sockb.in")) + end) + + it("works with Kong", function() + assert(make_request("ws://"..helpers.test_conf.proxy_ip..":"..helpers.test_conf.proxy_port.."/ws")) + end) + + it("works with Kong under HTTPS", function() + assert(make_request("wss://"..helpers.test_conf.proxy_ssl_ip..":"..helpers.test_conf.proxy_ssl_port.."/ws")) + end) +end)