Monday, July 6, 2015

Testing HTTP Requests

Just a quick post with some tips for troubleshooting and testing HTTP requests. For example, if you have a plugin that sends requests behind the scenes via Ajax or cURL or whatever, it’s nice to have a way to view request details such as headers, the response, and everything in between. This article is aimed primarily at WordPress users, but contains more general tips and tricks as well.

Use Core Control to track requests

Perhaps the best way to look at HTTP requests happening on WordPress sites is to installCore Control and activate the “HTTP Logging Module”. Then repeat whatever HTTP requests need made and revisit the plugin’s logging screen, which breaks everything down: URL, method, result, time, user agent, headers, cookies, and much more (see screenshots). Core Control is one of my favorite plugins to play with :)
[ WP Plugin: Core Control ]Core Control plugin with its HTTP Logger Module activated
[ WP Plugin: Core Control - HTTP Module ]Core Control’s HTTP Logger shows results
To iilustrate the usefulness of the HTTP logging module, here are the logged details of a phone-home to WordPress.org:
URL https://api.wordpress.org/core/version-check/1.7/?version=3.8.1&php=5.3.5&locale=en_US&mysql=5.1.54&local_package=&blogs=1&users=1&multisite_enabled=0
Method POST
Result 200 OK
Time Taken 0.30910992622375 seconds
HTTP Args 
timeout (integer) 3
redirection (integer) 5
httpversion (string) 1.0
user-agent (string) WordPress/3.8.1; http://example.com/
reject_unsafe_urls (boolean) false
blocking (boolean) true
headers 
Array
(
    [wp_install] => http://example.com/
    [wp_blog] => http://example.com/
)
cookies 
Array
(
)
compress (boolean) false
decompress (boolean) true
sslverify (boolean) true
sslcertificates (string) /var/www/example.com/wordpress/wp-includes/certificates/ca-bundle.crt
stream (boolean) false
filename NULL
limit_response_size NULL
HTTP POST body 
Array
(
    [translations] => []
)
HTTP Transports WP_HTTP_curl
Request Time 2014-02-07 00:23:40 --800
Those data are available for each logged HTTP request. As an older WP plugin, Core Control’s settings/logging screens appear a bit confusing (the WP Admin Area has changed significantly in the past two years), but all the data is available by first clicking on any logged request to toggle open more data. From there, you have three sub-screens available: “Request Details”, “Response Headers”, and “Response Body”, each with its own plethora of juicy HTTP infos.
Core Control includes numerous other modules as well so feel free to experiment and learn stuff. Also, this is one of those awesome plugins that hasn’t been updated in over two years, so visiting its page in the Plugin Directory you’ll see that yellow warning banner. But don’t let that scare you — the plugin works just as good today as it did over two years ago. It’s just a solid plugin that’s super-useful.

Perform a traceroute from the server

This method is a bit more advanced, requiring SSH connect to the server. Once connected, perform a traceroute to the target URL(s) using the following command:
traceroute example.com
The resulting traceroute will then reveal at exactly which point the HTTP request is failing (or not). The key here is that you’re making the request from the server, not your local machine. If needed, ask your web host for help with connecting via SSH. Or for more explanation, check out this post at WP-Mix.

Examine your server logs

If all else fails, examine your server’s access and error logs. They provide a wealth of data regarding many details of each request and/or error. As I explain in .htaccess made easy, HTTP investigations frequently begin and end with the server access and error logs.

Ask your host

Some hosts are better than others with providing help. So another thing that could be useful or provide some clues is to ask your host to look into whatever HTTP issue you’re dealing with, and/or if they have resources available that would be useful.