Curl сбрасывает последние 5 байт, но wget работает нормально - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть программа Kotlin, которую я использую для передачи файла на удаленный хост. Я пытаюсь получить файл на удаленном хосте с помощью curl. Эта программа отлично подходит для файлов с чистым текстом, но для файлов .jar она всегда теряет ровно 5 байт. С другой стороны, wget работает без проблем и не теряет 5 байтов.

Здесь, в случае его полезности, указан код Котлина

            val client = serverSocket.accept()
            val file = File(pathToFile)
            val bytes = ByteArray(16 * 1024)
            val instream = FileInputStream(file)
            val out = BufferedOutputStream(client.getOutputStream())

            var count: Int
            var sm = 0
            count = instream.read(bytes)

            while (count > 0) {
                sm += count
                out.write(bytes, 0, count)
                count = instream.read(bytes)
            }
            print("total bytes : $sm")
            out.flush()
            out.close()

Вот команды curl и wget, которые я использую:

wget -O file.jar 1.2.3.4:5678

curl 1.2.3.4:5678 -o file.jar

Вещи, которые являются правдой и могут иметь отношение:

Хост (запускающий приведенный выше код kotlin) является машиной Windows, а получатель работает под управлением Linux.

Файл JAR был создан на хосте.

Отправка JAR-файла через scp также работает нормально и приводит к тому, что файл не поврежден.

Независимо от того, используется ли curl или wget, общее количество байтов, напечатанных кодом Котлина, является правильным.

Такое поведение повторяется на 100%: его всегда ровно 5 байт, только для файлов JAR, независимо от того, как я его пробовал на нескольких компьютерах-получателях.

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

1 Ответ

0 голосов
/ 12 сентября 2018

Согласно документации wget, он поддерживает протоколы http (s) и ftp (s). То, что вы делаете, не является ни тем, ни другим. Тот факт, что это работает вообще, вероятно, потому что они обрабатывают несоответствующие http-серверы определенным образом, который работает для вас.

Если вы хотите сделать то, что делаете, вы можете по крайней мере поместить поддельный HTTP-ответ перед содержимым файла:

out.write("HTTP/1.1 200 OK\r\nContent-type: application/octet-stream\r\n\r\n"
          .getBytes(StandardCharsets.US_ASCII));
...