Загрузка данных через HTTP PUT без многоканального желоба - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь загрузить статический контент HTML + друзей в сырой репозиторий Nexus 3.Что касается , документация идет , единственный способ загрузить файлы - использовать HTTP PUT.Конечно же,

curl -v --user 'user:pw' --upload-file my_file.html  \
    http://my.nexus/repository/my-raw-repo/my_file.html

работает должным образом, и к файлу можно получить доступ по адресу http://my.nexus/repository/my-raw-repo/index.html

. Однако добавление этого развертывания в мой процесс Rake оказалось проблематичным.Вот некоторые вещи, которые я пробовал.

  1. С net/http:

    require 'net/http'
    uri = URI("http://my.nexus/repository/my-raw-repo")
    file = "index.html"
    Net::HTTP.start(uri.host, uri.port) do |http|
        request = Net::HTTP::Put.new "#{repo_url}/#{file}"
        request.basic_auth(user, pw)
    
        <snip>
    
        response = http.request request
        raise "Upload failed: #{response.code} #{response.message}\n#{response.body}" \
           unless response.is_a?(Net::HTTPSuccess)
    end
    

    Я пробовал несколько вариантов для <snip>.

    1. Установить тело для содержимого файла в виде строки:

      request.body = File.read("#{file}")`
      

      Запрос завершается без ошибок, но Nexus показывает размер файла 0 байтов.

    2. Отправить данные формы всодержимое файла в виде потока:

      request.set_form([['upload', File.open("#{file}")]], 'multipart/form-data')
      

      Это очевидно: добавлен многочастный желоб, который Nexus не удаляет:

      enter image description here

  2. С rest-client:

    require 'rest-client'
    file = "index.html"
    begin
        RestClient::Request.execute(
            method: :put,
            url: "http://my.nexus/repository/my-raw-repo/#{file}",
            <snip>
            user: user,
            password: pw
        )
    rescue RestClient::ExceptionWithResponse => e
        raise "Upload failed: #{e.response}"
    end
    

    И для <snip> (отгадывание не совсем понятной документации):

    1. body: File.read("#{file}")
      -> 0 байтов.
    2. payload: File.read("#{file}")
      -> 0 байтов.
    3. payload: { file: File.new("#{file}") }
      -> Multiостался желоб.
    4. payload: { multipart: false, file: File.new("#{file}") }
      -> остался желоб из нескольких частей.

    Мне кажется, я пробовал еще несколько комбинаций, которые я не помню, спохожие результаты.

Примечание: Я пропустил части, связанные с SSL с самозаверяющим сертификатом, потому что он не должен быть связан.

Как я могу сказать какой-либо библиотеке (или любой другой) сделать PUT с данными, но без нескольких частей?Или, если это не проблема, что я делаю неправильно?

Я хочу использовать полностью Ruby-решение (т.е. не делегировать системе curl), чтобы сборка была (как) переносимой (как)возможно).

1 Ответ

0 голосов
/ 13 мая 2019

С помощью net/http установите тело запроса для содержимого файла в виде потока:

request.body_stream = File.open("#{file}")
request.content_length = File.size("#{file}")
request.content_type = "text/plain" # ?!

Определение правильного типа MIME из одного файла - само по себе приключение.

...