Аутентифицируемый HTTP POST с полезной нагрузкой XML с помощью Python urllib2

Я пытаюсь отправить сообщение POST только с полезная нагрузка XML (я думаю), использующий urllib2 в IronPython. Однако каждый раз я отправляю его, это возвращает Код ошибки 400 (Плохой Запрос).

Я на самом деле пытаюсь имитировать Boxee, удаляют призыв объекта очереди, который фактические пакеты данных похож на это (от WireShark):

POST /action/add HTTP/1.1
User-Agent: curl/7.16.3 (Windows  build 7600; en-US; beta) boxee/0.9.21.11487
Host: app.boxee.tv
Accept: */*
Accept-Encoding: deflate, gzip
Cookie: boxee_ping_version=9; X-Mapping-oompknoc=76D730BC9E858725098BF13AEFE32EB5; boxee_app=e01e36e85d368d4112fe4d1b6587b1fd
Connection: keep-alive
Content-Type: text/xml
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Language: en-us,en;q=0.5
Keep-Alive: 300
Connection: keep-alive
Content-Length: 53

<message type="dequeue" referral="3102296"></message>

Я использую следующий код Python для отправки POST:

def PostProtectedPage(theurl, username, password, postdata):

    req = urllib2.Request(theurl, data=postdata)
    req.add_header('Content-Type', 'text/xml')
    try:
        handle = urllib2.urlopen(req)
    except IOError, e:                  # here we are assuming we fail
        pass
    else:                               # If we don't fail then the page isn't protected
        print "This page isn't protected by authentication."
        sys.exit(1)

    if not hasattr(e, 'code') or e.code != 401:                 # we got an error - but not a 401 error
        print "This page isn't protected by authentication."
        print 'But we failed for another reason.'
        sys.exit(1)

    authline = e.headers.get('www-authenticate', '')                # this gets the www-authenticat line from the headers - which has the authentication scheme and realm in it
    if not authline:
        print 'A 401 error without an authentication response header - very weird.'
        sys.exit(1)

    authobj = re.compile(r'''(?:\s*www-authenticate\s*:)?\s*(\w*)\s+realm=['"](\w+)['"]''', re.IGNORECASE)          # this regular expression is used to extract scheme and realm
    matchobj = authobj.match(authline)
    if not matchobj:                                        # if the authline isn't matched by the regular expression then something is wrong
        print 'The authentication line is badly formed.'
        sys.exit(1)
    scheme = matchobj.group(1) 
    realm = matchobj.group(2)
    if scheme.lower() != 'basic':
        print 'This example only works with BASIC authentication.'
        sys.exit(1)

    base64string = base64.encodestring('%s:%s' % (username, password))[:-1]
    authheader =  "Basic %s" % base64string
    req.add_header("Authorization", authheader)
    try:
        handle = urllib2.urlopen(req)
    except IOError, e:                  # here we shouldn't fail if the username/password is right
        print "It looks like the username or password is wrong."
        print e
        sys.exit(1)
    thepage = handle.read()
    return thepage

Однако каждый раз, когда я выполняю это, это возвращает Ошибку 400 (Плохой Запрос)
Я знаю, что аутентификация корректна, потому что я использую ее в другом месте для выборки очереди (и я не могу предположить, что она не используется, иначе как был бы он теперь который учетная запись применить изменение в?)

При рассмотрении сбора сетевых данных я мог просто избегать добавлять некоторые заголовки к запросу? Вероятно, что-то простое, но я просто не знаю достаточно о Python или Запросах HTTP для знания то, что что.

Править: BTW, я называю код следующим образом (это на самом деле динамично, но это - основная идея):

PostProtectedPage("http://app.boxee.tv/action/add", "user", "pass", "<message type=\"dequeue\" referral=\"3102296\"></message>")
6
задан Adam Haile 2 July 2010 в 13:29
поделиться