PUT method using drupal_http_request
For starters, looking at your code, $xml_data is instantiated but never used in your call to drupal_http_request(), you use the $data variable instead. Intentional or the culprit?

Second, your call to drupal_http_request follows the Drupal 6 (and earlier) syntax, what system are you using?

For Drupal 7, it should look like this:

$response = drupal_http_request($url, 
  array(
    'headers' =&gt; $headers,
    'method' =&gt; 'PUT', 
    'data' =&gt; $xml_data,
  )
);

// this should reveal what was actually sent out
dsm($response-&gt;request);


Hope this helps some!