Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dump HTTP requests in WildFly 8

To debug HTTP requests during development, I would like my WildFly 8 application server to dump HTTP requests, including request method and headers, to a log file. server.log would be fine.

In the sources of WildFly's HTTP subsystem, I found RequestDumpingHandler and the corresponding logging category io.undertow.request.dump

However, I cannot figure out, how to install that header so that it is applied for all requests served by my application (a WAR with some static resources and JAX-RS handler).

The corresponding documentation page (Undertow web subsystem configuration) doesn't really explain handlers. There is a <handler> element in the configuration section

<?xml version="1.0" ?>
<server xmlns="urn:jboss:domain:2.1">
    ...
    <profile>
        ...
        <subsystem xmlns="urn:jboss:domain:undertow:1.1">
        <buffer-cache name="default"/>
        <server name="default-server">
            <http-listener name="default" socket-binding="http"/>
            <host name="default-host" alias="localhost">
                <location name="/" handler="welcome-content"/>
                <filter-ref name="server-header"/>
                <filter-ref name="x-powered-by-header"/>
            </host>
        </server>
        <servlet-container name="default">
            <jsp-config/>
        </servlet-container>
        <handlers>
            <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
            <!-- <dump-request /> ?? or something?-->
        </handlers>
        <filters>
            <response-header name="server-header" header-name="Server" header-value="WildFly/8"/>
            <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
        </filters>
        </subsystem>
        ...
    </profile>
    ...
</server>

but as far as I can tell, only <file> and proxy are expected there(?).

How can I log full details of incoming HTTP requests in WildFly? I know I could install some logging mechanism at the JAX-RS layer, but I would like to have one dump mechanism that handles both REST API calls and statically served resources.

like image 758
Christian Klauser Avatar asked Nov 03 '14 13:11

Christian Klauser


3 Answers

You would need to add RequestDumpingHandler to your handler chain.

As part of wildfly 8.1, that is not yet possible in a friendly way.

This is improved in 8.2 and 9 so you will be able to configure this by adding something like this:

<host name="default-host" >
     .....
     <filter-ref name="request-dumper"/>
</host>
....
<filters>
    ...
    <filter name="request-dumper" class-name="io.undertow.server.handlers.RequestDumpingHandler" module="io.undertow.core" />
</filters>

in 8.1 only option now would be to add ServletExtension http://undertow.io/undertow-docs/undertow-docs-1.2.0/#servlet-extensions

that would add this RequestDumpingHandler to outer chain.

FWIW 8.2 release is almost ready, so you could wait for it or just build sources for 8.x branch.

To add above config via CLI, you can use:

/subsystem=undertow/configuration=filter/custom-filter=request-dumper:add(class-name="io.undertow.server.handlers.RequestDumpingHandler",  module="io.undertow.core")
/subsystem=undertow/server=default-server/host=default-host/filter-ref=request-dumper:add
like image 107
Tomaz Cerar Avatar answered Nov 08 '22 06:11

Tomaz Cerar


On Wildfly 9 and 10.1.0, it works just by adding

            <subsystem xmlns="urn:jboss:domain:undertow:3.1">
            <server name="default-server">
            <host name="default-host" alias="localhost">
                <access-log/>
            </host>
            </server>
            </sub-system>
like image 39
Karthik Murugan Avatar answered Nov 08 '22 07:11

Karthik Murugan


There are a number of people asking how to get the entire HTTP body logged out, not just the headers.

It seems an answer exists: https://8bitplatoon.blogspot.com/2017/02/dumping-http-requests-and-responses-in.html

In short, if that link doesn't survive, a simple addition to your standalone.xml will do the trick:

<system-properties> <property name="com.sun.xml.ws.transport.http.HttpAdapter.dump" value="true"/> </system-properties>

I added this after the <extensions>...</extensions> and before <management>...</management>, restarted wildfly, and was able to get complete HTTP bodies in my server logs (server.log in my case).

This does not interact with or depend on the Undertow "request dumper" at all as far as I can tell, you can do one, the other, or both.

like image 3
NAN Avatar answered Nov 08 '22 07:11

NAN