The proxy server acts as an intermediate server that relays requests between a client and a server. The proxy server keeps track of all the client-server interactions and outputs a log of the entire TCP communication. This allows you to monitor exactly what is going on, without having to access the main server.
You can find the proxy server in the appropriate installation folder:
You can use the proxy server to monitor all client-server interaction, regardless of the underlying communication protocol. For example, you can monitor the following protocols:
For example, you can position the proxy server between any two applications that communicate via a TCP/IP network; e.g. a web browser and AEM. This allows you to monitor exactly what happens when you request a AEM page.
The tool can be found in the /opt/helpers folder of your AEM installation. To start it type:
java -jar proxy.jar <host> <remoteport> <localport> [options]
The following scenarios illustrate a few of the purposes for which the Proxy Server Tool can be used:
Check for Cookies and their Values
The following log entry example shows all cookies and their values sent by the client on the 6th connection opened since proxy start:
C-6-#000635 -> [Cookie: cq3session=7e39bc51-ac72-3f48-88a9-ed80dbac0693; Show=ShowMode; JSESSIONID=68d78874-cabf-9444-84a4-538d43f5064d ]
Checking for Headers and their Values The following log entry example shows that the server is able to make a keep-alive connection and the content length header was properly set:
S-7-#000017 -> [Connection: Keep-Alive ] ... S-7-#000107 -> [Content-Length: 124 ]
Checking if Keep-Alive works
Keep-Alive means that a client re-uses the connection to the server to transports multiple files (the page code, pictures, style sheets and so on). Without keep-alive, the client has to establish a new connection for each request.
To check if keep-alive works:
Finding Lost Requests
If you lose requests in a complex server setting, for example with a firewall and a dispatcher, you can use the proxy server to find out where the request was lost. In case of a firewall:
If you experience hanging requests from time to time:
The log entries produced by proxy.jar all have the following format:
[timestamp (optional)] [<b>C</b>lient|<b>S</b>erver]-[ConnectionNumber]-[BytePosition] ->[Character Stream]
For example, a request for a Web page may look as follows:
C-0-#000000 -> [GET /author/prox.html?CFC_cK=1102938422341 HTTP/1.1 ]
When a connection closes, the following information is logged:
C-6-Finished: 758 bytes (1.0 kb/s) S-6-Finished: 665 bytes (1.0 kb/s)
This shows the number of bytes that passed between client and server on the 6th connection and at the average speed.
We shall review a simple template which produces the following code when requested:
<html> <head> <title>Welcome</title> </head> <body> Welcome to Playground<br> <img src="/logo.gif"> </body> </html>
If AEM is running on localhost:4303, start the proxy server as following:
java -jar proxy.jar localhost 4303 4444 -logfile test.log
You can access the server (
localhost:4303) without the proxy server, but if you access it via
localhost:4444, the proxy server will log the communication. Open a browser and access a page created with the above template. After that, look at the log file.
Until proxy.jar version 1.14, the log entries of one connection are not synchronized, meaning the log entries of one client/server connection are not necessary in the correct sequential order. The newer versions (>=1.14) of the proxy server do not have this issue.
When starting, the following information is written to the log:
starting proxy for localhost:4303 on port 4444 using logfile: C:\CQUnify355default\opt\helpers\test.log
The following header fields are listed at the start of the first connection (0), which is requesting the main HTML page:
C-0-#000000 -> [GET /author/prox.html?CFC_cK=1102936796533 HTTP/1.1 ] C-0-#000053 -> [Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, appl] C-0-#000194 -> [ication/x-shockwave-flash, */* ] C-0-#000227 -> [Accept-Language: de-ch ] C-0-#000251 -> [Accept-Encoding: gzip, deflate ] C-0-#000283 -> [User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) ] C-0-#000347 -> [Host: localhost:4444 ]
The Client requests a keep-alive connection, so the server can send multiple files over the same connection:
C-0-#000369 -> [Connection: Keep-Alive ]
The proxy server is a good tool to verify whether cookies are properly set or not. Here, we see the:
C-0-#000393 -> [Cookie: Show=ShowMode; cq3session=3bce15cf-1575-1b4e-8ea6-0d1a0c64738e; JSESSIONID=4161a56b-f193-d748-88a5-e09c5ff7ef2a ] C-0-#000514 -> [ ] S-0-#000000 -> [HTTP/1.0 200 OK ]
The server will close connection 0 after the request. Keep-alive is not possible, because the request has a question mark. This means that the server cannot return a cached version, and therefore cannot determine the content length at this point, which is required for a keep-alive connection.
S-0-#000017 -> [Connection: Close ] S-0-#000036 -> [Server: Communique Servlet Engine/3.5.5 ] S-0-#000077 -> [Content-Type: text/html;charset=iso-8859-1 ] S-0-#000121 -> [Date: Tue, 14 Dec 2004 09:46:44 GMT ] S-0-#000158 -> [Set-Cookie: JSESSIONID=4161a56b-f193-d8-88a5-e09c5ff7ef2a;Path=/author ] S-0-#000232 -> [ ]
Here, the server starts sending the HTML code on connection 0:
S-0-#000234 -> [<html> ] S-0-#000242 -> [.<head> ] S-0-#000251 -> [..<title>Welcome</title> ] S-0-#000277 -> [.</head> ] S-0-#000287 -> [.<body> ] S-0-#000296 -> [..Welcome to Playground<br> ] S-0-#000325 -> [..<img src="/author/logo.gif"> ] S-0-#000357 -> [.</body> ] S-0-#000367 -> [</html>]
Connection 0 closes immediately after the HTML file has been served:
C-0-Finished: 516 bytes (0.0 kb/s) S-0-Finished: 374 bytes (0.0 kb/s)
Now, the output starts for connection 1, which downloads the image contained in the HTML code:
C-1-#000000 -> [GET /author/logo.gif HTTP/1.1 ] C-1-#000031 -> [Accept: */* ] C-1-#000044 -> [Referer: http://localhost:4444/author/prox.html?CFC_cK=1102936796533 ] C-1-#000114 -> [Accept-Language: de-ch ] C-1-#000138 -> [Accept-Encoding: gzip, deflate ] C-1-#000170 -> [User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) ] C-1-#000234 -> [Host: localhost:4444 ]
Again, the client requests a keep-alive connection:
C-1-#000256 -> [Connection: Keep-Alive ] C-1-#000280 -> [Cookie: Show=ShowMode; cq3session=3bce15cf-1575-1b4e-8ea6-0d1a0c64738e; JSESSIONID=4161a56b-f193-d748-88a5-e09c5ff7ef2a ] C-1-#000401 -> [ ] S-1-#000000 -> [HTTP/1.0 200 OK ]
For connection 1, the server can provide keep-alive, because the image is static and therefore the content length is known.
S-1-#000017 -> [Connection: Keep-Alive ] S-1-#000041 -> [Server: Communique Servlet Engine/3.5.5 ] S-1-#000082 -> [Content-Type: image/gif ]
The server returns the content length of the image on connection 1:
S-1-#000107 -> [Content-Length: 124 ] S-1-#000128 -> [Date: Tue, 14 Dec 2004 09:46:44 GMT ] S-1-#000165 -> [ ]
Now that the content length is established, the server sends the image data on connection 1:
S-1-#000167 -> [GIF87a..........................,....... ...I....0.A..8......YDA.W...1..`i.`..6...Z...$@.F..)`..f..A.....iu.........$..;]
After the keep-alive timeout has been reached, connection 1 closes as well:
S-1-Finished: 291 bytes (0.0 kb/s) C-1-Finished: 403 bytes (0.0 kb/s)
The above example is comparatively simple, because the two connections occur sequentially: