Попытка реплицировать POST-запрос мобильного приложения в Ruby, ошибка 502 Gateway - PullRequest
0 голосов
/ 07 июля 2019

Я пытаюсь автоматизировать действия, которые можно выполнить вручную в приложении для iPhone с использованием Ruby, но когда я это делаю, я получаю ошибку 502 неверного шлюза.

Используя Charles Proxy, я получил запрос, который делает приложение для iPhone:

POST /1.1/user/-/friends/invitations HTTP/1.1
Host: redacted.com
Accept-Locale: en_US
Accept: */*
Authorization: Bearer REDACTED
Content-Encoding: gzip
Accept-Encoding: br, gzip, deflate
Accept-Language: en_US
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 66
Connection: keep-alive
X-App-Version: 814

invitedUserId=REDACTED&source=PROFILE_INVITATION

Я написал следующий код в Ruby, чтобы отправить этот же запрос:

@header_post = {
  "Host" => "redacted.com",
  "Accept-Locale" => "en_US",
  "Accept" => "*/*",
  "Authorization" => "Bearer REDACTED",
  "Content-Encoding" => "gzip",
  "Accept-Encoding" => "br, gzip, deflate",
  "Accept-Language" => "en_US",
  "Content-Type" => "application/x-www-form-urlencoded; charset=UTF-8",
  "Connection" => "keep-alive",
  "X-App-Version" => "814"
}
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
path = '/1.1/user/-/friends/invitations'

data = "invitedUserId=REDACTED&source=PROFILE_INVITATION"

resp, data = http.post(path, data, @header_post)

К сожалению, я получаю 502 Ошибка шлюза при запуске этого кода.

Одна вещь, которую я заметил, и которая, я думаю, является ключевой для решения, заключается в том, что в запросе POST, которое делает мобильное приложение, длина контента равна 66. Но длина строки "InviteUserId = REDACTED & source = PROFILE_INVITATION" с -идентифицированный userId всего 46.

Мне не хватает другой переменной формы с форматом "& param = value" длиной 20? Или я что-то упускаю?

Заранее спасибо!

1 Ответ

1 голос
/ 07 июля 2019

Вероятно, это не связано напрямую с длиной тела, которое вы отправляете.

Я вижу, возможно, 2 проблемы здесь:

  • ошибка 502: ваши uri.host иport правильно?Ошибка 502 означает, что на стороне сервера что-то не так.Также попробуйте удалить заголовок Host.
  • содержимое тела не распаковано

Вы определяете заголовок Content-Encoding: gzip, но не сжимаете данные (Net::Http не делает этого автоматически).

Попробуйте что-то вроде этого:

require "gzip"

@header_post = { 
  # ... 
}

http = Net::HTTP.new(uri.host, uri.port)
path = '/1.1/user/-/friends/invitations'

data = "invitedUserId=REDACTED&source=PROFILE_INVITATION"

# instanciate a new gzip buffer
gzip = Zlib::GzipWriter.new(StringIO.new)

# append your data
gzip << data

# get the gzip body and use it in your request
body = gzip.close.string
resp, data = http.post(path, body, @header_post)

В качестве альтернативы, возможно, сервер принимает несжатый контент.Вы можете попробовать просто удалить ошибку Content-Encoding из исходного кода.

Однако, если это была единственная ошибка, сервер должен отправить не 502, а ошибку 4xx.Так что я предполагаю, что есть другая проблема с конфигурацией uri, как предложено выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...