Hi,

I'm trying to grant road warrior users access to our company Exchange server through RPC over HTTP. In my setup, an Apache 2.2.2 on a FreeBSD server in the DMZ should act as a proxy between the Internet and the IIS on on the Exchange server. The communication is SSL-encrypted in both directions (SSLEngine and SSLProxyEngine On).

Unfortunately, the Outlook client just hangs when trying to access Exchange through the proxy. The Apache error log shows these messages:

[Mon Jul 10 10:48:48 2006] [error] (70007)The timeout specified has expired: proxy: prefetch request body failed to <exchangeip>:<port> (<exchange>) from <clientip> ()

After working on this for quite some time, I believe I can rule out the usual configuration and certificate problems that are described on various websites. Also, I have a Linux in my internal network with an older version of Apache (2.0.53) where the same proxy configuration works like a charm.

I did some analysis with ssldump on both proxies. Apparently, RPC over HTTP opens two HTTP/1.1 requests: One with request method RPC_IN_DATA to send data to the server, and one with method RPC_OUT_DATA to send data back to the client. The body consists of raw binary data, and the connections are apparently re-used for several RPCs.

I.e. after sending the headers for both connections, the client sends a request on the IN connections, reads the response from the OUT connection, sends another request on the IN connection and so on - which means that any buffering in the proxy is absolutely deadly in this scenario.

Here's an example of an IN connection header:
    RPC_IN_DATA /rpc/rpcproxy.dll?<exchange>:6002 HTTP/1.1
    Accept: application/rpc
    User-Agent: MSRPC
    Host: <proxy>
    Content-Length: 1073741824
    Connection: Keep-Alive
    Cache-Control: no-cache
    Pragma: no-cache
    Authorization: Basic <user/passwd>

And here's an example of an OUT connection header:
    RPC_OUT_DATA /rpc/rpcproxy.dll?<exchange>:6002 HTTP/1.1
    Accept: application/rpc
    User-Agent: MSRPC
    Host: <proxy>
    Content-Length: 76
    Connection: Keep-Alive
    Cache-Control: no-cache
    Pragma: no-cache
    Authorization: Basic <user/passwd>

ssldump on the Apache 2.2.2 machine shows that the RPC_OUT_DATA is correctly forwarded to the Exchange server. For the RPC_IN_DATA, OTOH, the proxy doesn't even open a connection to the Exchange server. I can only guess that's it's trying to read (prefetch?) a part or all of the 1073741824 bytes (Content-Length) before opening the session to the Exchange server.

Unfortunately, the client only sends a small request (~ 100 bytes) on the IN connection and starts waiting for a response on the OUT connection. It never gets one, though, since the request hasn't reached the Exchange server yet.

On the Apache 2.0.53 server, however, both requests are forwarded to the Exchange server, and the body bits are also relayed in a direct and timely manner. I've tried an Apache 2.0.58 on the FreeBSD server, but that one doesn't work, either.

Is there any option to configure mod_proxy and Apache core in 2.2.2 (or 2.0.58) to behave in the same way as the 2.0.53 version? Is there a source patch that I could apply (no idea what a brigade is and what it does)?

Thanks in advance,
  Hans

PS: I realize that the design of Microsoft's RPC over HTTP is somewhat broken. However, I guess my setup is not that unusual, and I'd like Apache to handle these unknown methods as interoperable as possible.

--
Hans Maurer                                               [EMAIL PROTECTED]

          "Deep down, I doubt my greed for presents can overcome
                          my desire to misbehave"

---------------------------------------------------------------------
The official User-To-User support forum of the Apache HTTP Server Project.
See <URL:http://httpd.apache.org/userslist.html> for more info.
To unsubscribe, e-mail: [EMAIL PROTECTED]
  "   from the digest: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to