Anton
тут пока не знаю, как это будет работать
Anton
я передаю не только файл
Илья
GetBody defines an optional func to return a new copy of Body. It is used for client requests when a redirect requires
reading the body more than once. Use of GetBody still requires setting Body
Илья
а, у тебя же файл, облом
Anton
угу)
Anton
я смотрел на это уже
Anton
Anton
а то илья фокс разочаруется во мне
Anton
:cattoCry:
Илья
https://pkg.go.dev/mime/multipart#File
тут есть ReaderAt
anhckie
anhckie
и под капотом там фастшттп, в тестах которого я нашел, что подставляется nil - потому и решил с ним тоже попробовать
anhckie
вот еще раз полный код приложу, для удобства.
handler.Get("test2", func(c *fiber.Ctx) error {
a := fiber.AcquireAgent()
log.Println("start")
var res []byte
code, body, err := a.Get(res, "http://google.com/foo/bar") // ЗДЕСЬ ПАДАЕМ
log.Println(err)
log.Println("get" + string(body))
log.Println(code)
log.Println("end")
return c.SendString("ok")
})
Patamen
anhckie
ага, вот так работает. и гет-, и пост-запросы!
anhckie
почему об этом в доке не писать..(
anhckie
а вам спасибище большущее ))
Patamen
Andrey
вот пример как с агентом работать же
anhckie
смотрю в книгу - вижу фигу. это про меня сегодня, жесть
Илья
неееееееет
Robert
Всем привет, пишу уже с криком о помощи))
Кейс:
Имеется приложение (предположительно на С/С++), которое крутится на винде и подтягивает к себе кучу .dll файлов. Доступа к исходникам этого приложения у нас нет.
Задача написать небольшой драйвер по образу и подобию старого .dll, но на Go.
Ход работы и суть проблемы: в гошную функцию из этого приложения передается строка типа char*, т.е. указатель, нужно по этому указателю вписать некую результирующую строку.
Как нам сказали, память уже выделена, т.е. с гошной стороны никакого малока делать не нужно, только вписать результат.
В результате возникает Access violation с значением указателя по которому пытаемся писать.
Затем мы написали аналогичную функцию на С++ и собрали всё как .dll соответственно, которая также пишет результат в строку-входной параметр, итог: всё работает, выводили в лог указатель, он отличается от того, что передается в гошную функцию.
Выглядит это, словно какой-то сдвиг в областях памяти при подкачиванти плюсовой и гошной .dll'ки.
Кто-то знает об этом что-нибудь?)
Robert
Также я написал простенький вызыватель .dll на С и все отлично работает, все чётко стыкуется с гошной либой
Robert
Отличие, что линковка в данном случае у меня происходила на этапе компиляции, а на проде она происходит в рантайме
NU
как сбилдить код по арм?
Alexandr🇷🇺
NU
ой сорри, да
NU
спс
Alexandr🇷🇺
https://habr.com/ru/post/249449/
Илья
Всем привет, пишу уже с криком о помощи))
Кейс:
Имеется приложение (предположительно на С/С++), которое крутится на винде и подтягивает к себе кучу .dll файлов. Доступа к исходникам этого приложения у нас нет.
Задача написать небольшой драйвер по образу и подобию старого .dll, но на Go.
Ход работы и суть проблемы: в гошную функцию из этого приложения передается строка типа char*, т.е. указатель, нужно по этому указателю вписать некую результирующую строку.
Как нам сказали, память уже выделена, т.е. с гошной стороны никакого малока делать не нужно, только вписать результат.
В результате возникает Access violation с значением указателя по которому пытаемся писать.
Затем мы написали аналогичную функцию на С++ и собрали всё как .dll соответственно, которая также пишет результат в строку-входной параметр, итог: всё работает, выводили в лог указатель, он отличается от того, что передается в гошную функцию.
Выглядит это, словно какой-то сдвиг в областях памяти при подкачиванти плюсовой и гошной .dll'ки.
Кто-то знает об этом что-нибудь?)
а как вы записываете строку через го?
Robert
ой, кучу всего пробовали, весь стак по факту
Robert
но в итоговой версии через C.strcpy
Robert
не думаю, что это проблема, потому что С Сишным приложением для тестов нормально отработало и все записало
Илья
но в итоговой версии через C.strcpy
This function only works with C style strings and not C++ style strings i.e. it only works with strings of type char str[]; and not string s1; which are created using standard string data type available in C++ and not C.
возможно чем-то поможет
Артем
Всем привет. Подскажите, пожалуйста, для работы программы на го нужен gcc, еще разные сишные либы (libvips и др..). Собираю докерфайл, если делать без мультистейджа, то выходит ~1.5 гига, что достаточно многовато) (с +- мультистейджем, который я придумал, выходит Поделитесь, если кто знает, как быть? В идеале, что бы на 1 стейдже все либы скачать, сбилдить гошный файл, как то включить в бинарь все либы или что-то ткаое и просто во 2м стейдже бинарь запустить. Могу поделиться докерфайлом
Vladislav
Всем привет. Подскажите, пожалуйста, для работы программы на го нужен gcc, еще разные сишные либы (libvips и др..). Собираю докерфайл, если делать без мультистейджа, то выходит ~1.5 гига, что достаточно многовато) (с +- мультистейджем, который я придумал, выходит Поделитесь, если кто знает, как быть? В идеале, что бы на 1 стейдже все либы скачать, сбилдить гошный файл, как то включить в бинарь все либы или что-то ткаое и просто во 2м стейдже бинарь запустить. Могу поделиться докерфайлом
конечно мультистэйджем делать
Артем
это понятно, но нужны либы, си компайлер и еще пара штук
Vladislav
а си компайлер зачем?
Vladislav
скомпилированный бинарь и без него запустится
Vladislav
а либы скопировать так же как артефакт сборки или так же установить
Артем
там большая либа и у нее куча зависимостей
Vladislav
ты ищешь способ как сделать правильно или оправдания почему не делать правильно?
Vladislav
со вторым не помогу, извини
Артем
сейчас, секунду
Артем
вот смотрите, на 1 стейдже ставлю голанг, си компайлер и сами либы. В гошной программе у меня библиотека на го, которая использует сишные библиотеки. Какие шаги дальше?
Maks
Копирнуть в него нужные либы и исходники
Maks
Далее билдишь в директорию
Vladislav
Vladislav
чуть многостадийного билда в том, что вы в контейнер следующей стадии копируете артифакты предыдущей стадии
Vladislav
а контейнер предыдущей стадии оставляете позади, отбрасываете
Артем
я понимаю суть мультистейджа, но не понимаю как мне тучу каких то .c и .h файлов не пойми откуда сбилдить 'куда-то'
Vladislav
а зачем копировать .c и .h файлы
Артем
скомпилировать
Vladislav
тебе уже скомпилированное надо скопировать в конечный контейнер
Артем
вот смотрите, https://packages.debian.org/ru/sid/libvips42, пакет и в нем куча еще зависимостей. Ставлю это через apt install. Он сам куда надо встает и в path тоже. Что мне с кучей этих файлов делать, я не понимаю вобще..
Vladislav
Vladislav
на первой стадии компилите бинарь
Артем
гошный бинарь?
Vladislav
копируете во вторую стадию
Артем
верно ведь
Vladislav
гошный, да
Vladislav
должно срастись всё
Артем
я еще раз сейчас попробую так сделать, но в прошлый раз ругался, что не хватает shared-library
Артем
минутку, попробую. Спасибо
Артем
Да, не хватает файла какого-то
Артем
Артем
щас попробую поискать через find, где он, если поставить libvips
Vladislav
Vladislav
ну или действительно .so скопировать
Артем
а лол. Да, так запускалось все. Но контейнер большеват был. Сейчас еще раз соберу так и посмотрю. Думаю +- 50-100мб можно освободить, убрав кеши
Артем
кстати, так не собралось. На 1 стейдж надо все-таки libvips-dev
Vladislav
а вы читаете, что я пишу?
Vladislav
я говорю, что при сборке ставим -dev