Почему веб-службы Amazon не могут анализировать мой XML-документ с пакетным запросом на аннулирование CloudFront? - PullRequest
0 голосов
/ 07 января 2012

Я пытаюсь сделать недействительными некоторые объекты, загруженные в Amazon CloudFront, с помощью их API для аннулирования.

Согласно их документации, я отправляю запрос POST с XML-документом в качестве содержимого. В документе XML указаны пути для аннулирования.

Ошибка, которую я получаю от Amazon:

<Error>
    <Type>Sender</Type>
    <Code>MalformedInput</Code>
    <Message>Could not parse XML</Message>
</Error>

Насколько я вижу, мой XML-документ соответствует их документации.

Их документация:

Мой документ XML:

<InvalidationBatch xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/">
    <Path>/-o-replace.css</Path>
    <Path>/-o-set-link-source.css</Path>

    ...16 other path elements, each containing only letters, numbers, hyphens and periods

    <CallerReference>fixing-accidental-setting-of-gzip-header</CallerReference>
</InvalidationBatch>

Я пытался включить пролог XML, как они это делают в своем ответе, сохраняя и удаляя пробелы и пропуская атрибут xmlns, но все безрезультатно.

Я отправляю запрос POST вручную, используя Python. Вот код Python, используемый для его отправки. Я подтвердил, что содержимое файла правильно прочитано.

from httplib import HTTPSConnection
from datetime import datetime
from hashlib import sha1
import hmac

conneck = HTTPSConnection('cloudfront.amazonaws.com')

invalidation_file = file('invalidation.xml')
invalidation = unicode(invalidation_file.read()).encode('utf-8')

now_as_string = datetime.now().strftime('%a, %d %b %Y %H:%M:%S GMT')
signature = hmac.new('MY_SECRET_KEY', now_as_string, sha1).digest().encode('base64')

conneck.request('POST', '/2010-11-01/distribution/MY_DISTRIBUTION_ID/invalidation', invalidation, {
     'Content-Type': 'text/xml',
    'Authorization': 'AWS MY_ACCESS_KEY_ID' + ':' + signature,
       'x-amz-date': now_as_string,
})

response = conneck.getresponse()

Кто-нибудь может увидеть, что я делаю не так?

1 Ответ

1 голос
/ 14 марта 2012

Не эксперт по CF API, но я думаю, что вы неправильно используете кодировку base64, см. Пример:

>>> 'xyz'.encode('base64')
'eHl6\n'
>>> base64.b64encode('xyz')
'eHl6'
...