Как получить данные из http.customRequest Haxe без сбоев? - PullRequest
0 голосов
/ 10 сентября 2018

Предупреждение: я очень новичок в Haxe.

Я пытаюсь использовать http.customRequest (с целью последующего выполнения запросов PUT и DELETE). Но когда я пытаюсь получить доступ к полученным байтам, я получаю ошибку сегментации с C ++ и NullPointerException с Java.

Я гуглил по поводу некоторых других применений customRequest, и то, что я делаю, не кажется неправильным, но ясно, что это так.

class Main {
    static function main() {
        var req = new haxe.Http("https://httpbin.org/put");
        var responseBytes = new haxe.io.BytesOutput();

        req.onError = function(err) {
            trace("onError");
            trace(err); // Java says NullPointerException
        };

        req.onStatus = function(status) {
            trace("About to get bytes");

            // Removing these lines prevents the errors
            var b = responseBytes.getBytes();
            trace("Got the bytes");
            trace(b.length); // Shouldn't be empty, but is
        };

        req.customRequest(false, responseBytes, null, "PUT");
    }
}

Я пробовал это с текущей версией и с HEAD (через Brew).

Я думаю, что мои командные строки довольно простые:

$ haxe -cp src -main Main -java bin/java
$ java -jar bin/java/Main.jar
src/Main.hx:12: About to get bytes
src/Main.hx:16: Got the bytes
src/Main.hx:17: 0
src/Main.hx:7: onError
src/Main.hx:8: java.lang.NullPointerException

$ haxe -cp src -main Main -cpp bin/cpp
$ ./bin/cpp/Main
src/Main.hx:12: About to get bytes
src/Main.hx:16: Got the bytes
src/Main.hx:17: 0
[1]    54544 segmentation fault  ./bin/cpp/Main

В случае, если это полезно, вот несколько неверный вывод для Python:

$ haxe -cp src -main Main -python bin/Main.py
$ python3 bin/Main.py
onError
True
About to trace err
SSLError(1, '[SSL: TLSV1_ALERT_INTERNAL_ERROR] tlsv1 alert internal error (_ssl.c:1045)')

Я бы очень признателен за любые рекомендации. ТИА

( Повторно отправлено с форума Haxe, где у меня не было ответа.)

1 Ответ

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

Это довольно интересное взаимодействие, вот что происходит по порядку:

  • sys.Http получает ответ и звонит onStatus().
  • Вы вызываете responseBytes.getBytes(), что приводит к аннулированию внутреннего буфера в haxe.io.BytesBuffer.getBytes(). Документы этого метода имеют состояние «После вызова буфер больше не может использоваться», поскольку он устанавливает внутренний буфер b в null.
  • Класс Http затем пытается выполнить запись в тот же буфер, который больше недопустим.
  • Поскольку существует вся логика вокруг всей логики, обратный вызов onError() вызывается из-за пустой ссылки.

Код состояния, переданный на onStatus(), равен 200 (ОК), поэтому, кроме вызова getBytes(), запрос, кажется, работает должным образом. И согласно apitester.com , data пуст для этого конкретного запроса.

...