Hi, I deployed a http4k app using Apache Server on...
# http4k
r
Hi, I deployed a http4k app using Apache Server on Cloud Foundry but couldn't figure out why I can't access it... local curl (on localhost) worked ok but any way to access from outside always got a 400 (with message: "Not authoritative"). So I tried locally starting a server with simply
app.asServer(ApacheServer(8080))
accessing from
<http://localhost:8080>
no problem, but trying using the loopback ip
127.0.0.1
or
0.0.0.0
didn't work.
Copy code
➜ curl --verbose <http://127.0.0.1:8080> 
*   Trying 127.0.0.1:8080...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 400 Bad Request
< Connection: close
< Date: Mon, 12 Oct 2020 13:36:26 GMT
< Server: Apache-HttpCore/5.0.2 (Java/11.0.8)
< Content-Length: 17
< Content-Type: text/plain; charset=ISO-8859-1
< 
* Closing connection 0
Not authoritative%
I tried specify the address to the server
app.asServer(ApacheServer(8080, InetAddress.getByName("0.0.0.0")))
but no luck either. Finally gave up and move to Jetty which worked as a charm, but still wanting to know if you have an explanation or a configuration that should work with Apache. Thanks.
If that can help a test that proves it:
Copy code
@Test
    fun ApacheServerTest() {
        val app: HttpHandler = {r: Request -> Response(OK).body(r.body) }
        app.asServer(ApacheServer(8000)).start()

        val cli: HttpHandler = OkHttp()

        val responseLocalHost = cli(Request(Method.GET, "<http://localhost:8000>")).body("from Localhost")
        println("Localhost: $responseLocalHost")
        val response127 = cli(Request(Method.GET, "<http://127.0.0.1:8000>")).body("from 127.0.0.1")
        println("127.0.0.1: $response127")
        val response0 = cli(Request(Method.GET, "<http://0.0.0.0:8000>")).body("from 0.0.0.0")
        println("0.0.0.0: $response0")
        responseLocalHost.status shouldBe OK
        response127.status shouldBe OK
        response0.status shouldBe OK
    }
And the one setting the ip to 127.0.0.1 and still only working for
localhost
only:
Copy code
@Test
    fun ApacheServerTestForcingLocalHost() {
        val app: HttpHandler = {r: Request -> Response(OK).body(r.body) }
        val apache = ApacheServer(8000, InetAddress.getLoopbackAddress())
        app.asServer(apache).start()
        println("Server started: http://${apache.address}:${apache.port}")
        val cli: HttpHandler = OkHttp()

        val responseLocalHost = cli(Request(Method.GET, "<http://localhost:8000>")).body("from Localhost")
        println("Localhost: $responseLocalHost")
        val response127 = cli(Request(Method.GET, "<http://127.0.0.1:8000>")).body("from 127.0.0.1")
        println("127.0.0.1: $response127")
        val response0 = cli(Request(Method.GET, "<http://0.0.0.0:8000>")).body("from 0.0.0.0")
        println("0.0.0.0: $response0")
        responseLocalHost.status shouldBe OK
        response127.status shouldBe OK
        response0.status shouldBe OK
    }
s
Find a config to set it to bind to *:8080 and not only localhost:8080 or something like that
r
Ok, thanks, but how you do that... couldn't figure out where the java ApacheServer library is to try to find there informations... Turns out the Apache Httpd server is a much bigger hit in google thant the java library 😄