headers.bats 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #!/usr/bin/env bats
  2. load test_helpers
  3. SUT_CONTAINER=bats-nginx-proxy-${TEST_FILE}
  4. function setup {
  5. # make sure to stop any web container before each test so we don't
  6. # have any unexpected container running with VIRTUAL_HOST or VIRUTAL_PORT set
  7. stop_bats_containers web
  8. }
  9. @test "[$TEST_FILE] start a nginx-proxy container" {
  10. # GIVEN
  11. run nginxproxy $SUT_CONTAINER -v /var/run/docker.sock:/tmp/docker.sock:ro
  12. assert_success
  13. docker_wait_for_log $SUT_CONTAINER 9 "Watching docker events"
  14. }
  15. @test "[$TEST_FILE] nginx-proxy passes arbitrary header" {
  16. # WHEN
  17. prepare_web_container bats-host-1 80 -e VIRTUAL_HOST=web.bats
  18. dockergen_wait_for_event $SUT_CONTAINER start bats-host-1
  19. sleep 1
  20. # THEN
  21. run curl_container $SUT_CONTAINER /headers -H "Foo: Bar" -H "Host: web.bats"
  22. assert_output -l 'Foo: Bar'
  23. }
  24. ##### Testing the handling of X-Forwarded-For #####
  25. @test "[$TEST_FILE] nginx-proxy generates X-Forwarded-For" {
  26. # WHEN
  27. prepare_web_container bats-host-2 80 -e VIRTUAL_HOST=web.bats
  28. dockergen_wait_for_event $SUT_CONTAINER start bats-host-2
  29. sleep 1
  30. # THEN
  31. run curl_container $SUT_CONTAINER /headers -H "Host: web.bats"
  32. assert_output -p 'X-Forwarded-For:'
  33. }
  34. @test "[$TEST_FILE] nginx-proxy passes X-Forwarded-For" {
  35. # WHEN
  36. prepare_web_container bats-host-3 80 -e VIRTUAL_HOST=web.bats
  37. dockergen_wait_for_event $SUT_CONTAINER start bats-host-3
  38. sleep 1
  39. # THEN
  40. run curl_container $SUT_CONTAINER /headers -H "X-Forwarded-For: 1.2.3.4" -H "Host: web.bats"
  41. assert_output -p 'X-Forwarded-For: 1.2.3.4, '
  42. }
  43. ##### Testing the handling of X-Forwarded-Proto #####
  44. @test "[$TEST_FILE] nginx-proxy generates X-Forwarded-Proto" {
  45. # WHEN
  46. prepare_web_container bats-host-4 80 -e VIRTUAL_HOST=web.bats
  47. dockergen_wait_for_event $SUT_CONTAINER start bats-host-4
  48. sleep 1
  49. # THEN
  50. run curl_container $SUT_CONTAINER /headers -H "Host: web.bats"
  51. assert_output -l 'X-Forwarded-Proto: http'
  52. }
  53. @test "[$TEST_FILE] nginx-proxy passes X-Forwarded-Proto" {
  54. # WHEN
  55. prepare_web_container bats-host-5 80 -e VIRTUAL_HOST=web.bats
  56. dockergen_wait_for_event $SUT_CONTAINER start bats-host-5
  57. sleep 1
  58. # THEN
  59. run curl_container $SUT_CONTAINER /headers -H "X-Forwarded-Proto: https" -H "Host: web.bats"
  60. assert_output -l 'X-Forwarded-Proto: https'
  61. }
  62. ##### Testing the handling of X-Forwarded-Port #####
  63. @test "[$TEST_FILE] nginx-proxy generates X-Forwarded-Port" {
  64. # WHEN
  65. prepare_web_container bats-host-6 80 -e VIRTUAL_HOST=web.bats
  66. dockergen_wait_for_event $SUT_CONTAINER start bats-host-6
  67. sleep 1
  68. # THEN
  69. run curl_container $SUT_CONTAINER /headers -H "Host: web.bats"
  70. assert_output -l 'X-Forwarded-Port: 80'
  71. }
  72. @test "[$TEST_FILE] nginx-proxy passes X-Forwarded-Port" {
  73. # WHEN
  74. prepare_web_container bats-host-7 80 -e VIRTUAL_HOST=web.bats
  75. dockergen_wait_for_event $SUT_CONTAINER start bats-host-7
  76. sleep 1
  77. # THEN
  78. run curl_container $SUT_CONTAINER /headers -H "X-Forwarded-Port: 1234" -H "Host: web.bats"
  79. assert_output -l 'X-Forwarded-Port: 1234'
  80. }
  81. ##### Other headers
  82. @test "[$TEST_FILE] nginx-proxy generates X-Real-IP" {
  83. # WHEN
  84. prepare_web_container bats-host-8 80 -e VIRTUAL_HOST=web.bats
  85. dockergen_wait_for_event $SUT_CONTAINER start bats-host-8
  86. sleep 1
  87. # THEN
  88. run curl_container $SUT_CONTAINER /headers -H "Host: web.bats"
  89. assert_output -p 'X-Real-IP: '
  90. }
  91. @test "[$TEST_FILE] nginx-proxy passes Host" {
  92. # WHEN
  93. prepare_web_container bats-host-9 80 -e VIRTUAL_HOST=web.bats
  94. dockergen_wait_for_event $SUT_CONTAINER start bats-host-9
  95. sleep 1
  96. # THEN
  97. run curl_container $SUT_CONTAINER /headers -H "Host: web.bats"
  98. assert_output -l 'Host: web.bats'
  99. }
  100. @test "[$TEST_FILE] nginx-proxy supresses Proxy for httpoxy protection" {
  101. # WHEN
  102. prepare_web_container bats-host-10 80 -e VIRTUAL_HOST=web.bats
  103. dockergen_wait_for_event $SUT_CONTAINER start bats-host-10
  104. sleep 1
  105. # THEN
  106. run curl_container $SUT_CONTAINER /headers -H "Proxy: tcp://foo.com" -H "Host: web.bats"
  107. refute_output -l 'Proxy: tcp://foo.com'
  108. }
  109. @test "[$TEST_FILE] stop all bats containers" {
  110. stop_bats_containers
  111. }