Monday, July 25, 2011

Debugging Titanium xhr requests with php

Authentication for xhr request for Appcelerator Titanium is difficult. During my latest bout with the cross platform mobile app platform I discovered that XHR request header variable names get renamed (aka case changes).

For the auth part of the app being worked on requires sending a Session Key for authorization for every request after the user is logged in. For a good tutorial on how a more basic authorization might work go check out Titanium User Authentication. In any case request headers sent from Titanium are re-cased i.e. "UserAuthKey" becomes "Userauthkey".

To discover this lil gem of a problem after hours of poking I chose to find and use a logging utility to see what was actually being sent.

Below is a quick php POST logging utility from CodeWord with headers added. This logging utility serializes the incoming Post request to a logs directory. It makes it easy to see the variables being passed in and headers.

To use, create a php file called xhrlog.php. Upload to your favorite testing server. Ensure you have a directory called "logs". Then submit your xhr POST requests to MYDOMAIN.com/xhrlog.php from php, html, android, titanium.. wherever and it'll log it for you!

<?php

 
  /*function from http://blog.apokalyptik.com/2008/03/25/logging-post-data/comment-page-1/
Creates a log file of the POST request
*/ 
if ( isset($_POST) && is_array($_POST) && count($_POST) > 0 ) {
  $log_dir = dirname( __FILE__ ) . '/logs/';
  $log_name = "posts-" . $_SERVER['REMOTE_ADDR'] . "-" . date("Y-m-d-H") . ".log";
  $log_entry = gmdate('r') . "\t" .serialize(parseRequestHeaders())."\n ". $_SERVER['REQUEST_URI'] . "\r\n" . serialize($_POST) . "\r\n\r\n";
  $fp=fopen( $log_dir . $log_name, 'a' );
  fputs($fp, $log_entry);
  fclose($fp); }
   
/*
function copied from stackoverflow http://stackoverflow.com/questions/541430/how-do-i-read-any-request-header-in-php

Parses html request headers
*/
  function parseRequestHeaders() {
    $headers = array();
    foreach($_SERVER as $key => $value) {
        if (substr($key, 0, 5) <> 'HTTP_') {
            continue;
        }
        $header = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
        $headers[$header] = $value;
    }
    return $headers;
}

?>



Stumble Upon CodePyro

1 comment:

lin liyi said...

Comfortably go up against many of the options available from the more established replica watches at this level. I do concur with the stated observations of the dial. It does seem too imperfect to me. In the close up shot of the breitling replica sale aperture, there seem to be imperfections around the seconds sub dial. I think that a better finished dial and better hands would make this look great. Basically what I am trying to say is that the dial swiss replica watches totally fine in person, and the slight texture aberrations actually make it feel a bit more organic and less cold and industrial. I really did like this replica watches sale a lot. To me, this watch looks absolutely tip top. In fact, to to make sure that the enamel dial and the replica watches uk finishing are flawless.

Post a Comment