Перейти к содержимому
  • 0
ov3rwrite

Вырезание при пост-реквесте

Вопрос

При отправке POST запроса столкнулся с тем что internet.request() либо что-то еще вырезает значение Content-Type из таблицы headers(об этом мне рассказал друг когда я столкнулся с кодом 400) которая отправляется и запрос просылается дальше.Можно ли этого как-то избежать и с чем это связано?

Изменено пользователем ov3rwrite

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

Если заглянуть в RFC2616 (HTTP/1.1), то можно извлечь, что наличие заголовка "Content-Type" у запросов имеющих тело (POST в том числе) ОБЯЗАТЕЛЬНО.

 

З.Ы. Проверил в эмуляторе. Заголовок "Content-Type" присутствует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

И как же вы проверяли?Лично у меня возник код 400(Bad Request) при отправке запроса, и я ТОЧНО знаю что дело именно в Content-Type.Тем более, я отправлял одни и те же данные с программы на Python и на Lua, где питон возвращал все корректно, а луа опять же возвращал 400(проверял на ocelot desktop).

 

инфа из непроверенных источников:

Скрытый текст

image.png.c6071f07a9ec1d9885e65131f4e55d59.png

 

Изменено пользователем ov3rwrite

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 29.08.2020 в 09:23, ov3rwrite сказал:

И как же вы проверяли?Лично у меня возник код 400(Bad Request) при отправке запроса, и я ТОЧНО знаю что дело именно в Content-Type.Тем более, я отправлял одни и те же данные с программы на Python и на Lua, где питон возвращал все корректно, а луа опять же возвращал 400(проверял на ocelot desktop).

 

инфа из непроверенных источников:

  Скрыть содержимое

image.png.c6071f07a9ec1d9885e65131f4e55d59.png

 

В коде самого мода есть строка на тему что headers выкл или вкл.
Может дело в настройках?
 

@Callback(doc = """function(url:string[, postData:string[, headers:table]]):userdata -- Starts an HTTP request. If this returns true, further results will be pushed using `http_response` signals.""")
  def request(context: Context, args: Arguments): Array[AnyRef] = this.synchronized {
    checkOwner(context)
    val address = args.checkString(0)
    if (!Settings.get.httpEnabled) {
      return result(Unit, "http requests are unavailable")
    }
    if (connections.size >= Settings.get.maxConnections) {
      throw new IOException("too many open connections")
    }
    val post = if (args.isString(1)) Option(args.checkString(1)) else None
    val headers = if (args.isTable(2)) args.checkTable(2).collect {
      case (key: String, value: AnyRef) => (key, value.toString)
    }.toMap
    else Map.empty[String, String]
    if (!Settings.get.httpHeadersEnabled && headers.nonEmpty) {
      return result(Unit, "http request headers are unavailable")
    }
    val request = new InternetCard.HTTPRequest(this, checkAddress(address), post, headers)
    connections += request
    result(request)
  }

Хотя в таком случае он должен сказать фи... и не делать запрос...
Стоит прочекать...

Изменено пользователем Taruu

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В коде OpenOS Есть вообще упоротый парсер для аргументов :/
 

Скрытый текст

function internet.request(url, data, headers, method)
  checkArg(1, url, "string")
  checkArg(2, data, "string", "table", "nil")
  checkArg(3, headers, "table", "nil")
  checkArg(4, method, "string", "nil")

  if not component.isAvailable("internet") then
    error("no primary internet card found", 2)
  end
  local inet = component.internet

  local post
  if type(data) == "string" then
    post = data
  elseif type(data) == "table" then
    for k, v in pairs(data) do
      post = post and (post .. "&") or ""
      post = post .. tostring(k) .. "=" .. tostring(v)
    end
  end

  local request, reason = inet.request(url, post, headers, method)
  if not request then
    error(reason, 2)
  end

  return setmetatable(
  {
    ["()"] = "function():string -- Tries to read data from the socket stream and return the read byte array.",
    close = setmetatable({},
    {
      __call = request.close,
      __tostring = function() return "function() -- closes the connection" end
    })
  },
  {
    __call = function()
      while true do
        local data, reason = request.read()
        if not data then
          request.close()
          if reason then
            error(reason, 2)
          else
            return nil -- eof
          end
        elseif #data > 0 then
          return data
        end
        -- else: no data, block
        os.sleep(0)
      end
    end,
    __index = request,
  })
end

 

Но Headers вообще никто не трогает ...

Так то еще есть выбор метода вот может его нужно и указать.

 

Изменено пользователем Taruu

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 31.08.2020 в 08:41, Taruu сказал:

В коде OpenOS Есть вообще упоротый парсер для аргументов :/
 

  Скрыть содержимое


function internet.request(url, data, headers, method)
  checkArg(1, url, "string")
  checkArg(2, data, "string", "table", "nil")
  checkArg(3, headers, "table", "nil")
  checkArg(4, method, "string", "nil")

  if not component.isAvailable("internet") then
    error("no primary internet card found", 2)
  end
  local inet = component.internet

  local post
  if type(data) == "string" then
    post = data
  elseif type(data) == "table" then
    for k, v in pairs(data) do
      post = post and (post .. "&") or ""
      post = post .. tostring(k) .. "=" .. tostring(v)
    end
  end

  local request, reason = inet.request(url, post, headers, method)
  if not request then
    error(reason, 2)
  end

  return setmetatable(
  {
    ["()"] = "function():string -- Tries to read data from the socket stream and return the read byte array.",
    close = setmetatable({},
    {
      __call = request.close,
      __tostring = function() return "function() -- closes the connection" end
    })
  },
  {
    __call = function()
      while true do
        local data, reason = request.read()
        if not data then
          request.close()
          if reason then
            error(reason, 2)
          else
            return nil -- eof
          end
        elseif #data > 0 then
          return data
        end
        -- else: no data, block
        os.sleep(0)
      end
    end,
    __index = request,
  })
end

 

Но Headers вообще никто не трогает ...

Так то еще есть выбор метода вот может его нужно и указать.

 

выбор метода стоит, post

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...