Dk
Глупый вопрос, наверное. У меня браузер два раза запрос к серверу делает. Как это починить?
Sam
Он иконку запрашивает наверно
Pavel
Я вангую, что это префлайт запрос для cors.
Dk
Ну всё просто. Я сделал хендлер http, сделал вывод пути и метода. В итоге при каждом запросе у меня печатается GET /path GET /path
Pavel
Ну если все просто, то не делай два запроса. Делов то.
Igor
Ребята, как в gin-gonic заставить работать binding:"required" ?
Ilya
а никому случайно не попадался in-memory PostgreSQL?
snip
Ну всё просто. Я сделал хендлер http, сделал вывод пути и метода. В итоге при каждом запросе у меня печатается GET /path GET /path
Когда то давно такой фокус можно было наблюдать из за imarker, не знаю живы ли они сейчас
Ilya
типа https://github.com/yandex-qatools/postgresql-embedded но гошный
Anonymous
вопрос вызов buffio.scanner.Scan() блокирующий?
Aleksandr
типа https://github.com/yandex-qatools/postgresql-embedded но гошный
in-memory - это когда в оперативной памяти хранит данные. embedded - это когда встраивается куда-то
Ilya
ну да, это джавная штучка
Ilya
я для юнит-тестов ищу способ работать с базой
Ilya
хватало sqlite пока не попался специфически постресовский синтаксис
Dk
все просто... ты посмотри developers tools в браузере и покажи нам что за запросы
func main() { http.HandleFunc("/", handlf) log.Fatal(http.ListenAndServe(":8080", nil)) } func handlf(w http.ResponseWriter, r *http.Request) { log.Println(r.Method, r.URL.Path) } всё убрал, оставил это. Кажется, я по глупости воткнул пермамент редирект и браузер теперь редирект делает из кэша диска.
Dk
Dk
Буду знать, спасибо, @zelenin
Aleksandr
Редирект из кэша.
Pawel
Для системы 32 или 64 бит? Для LE или BE?
LE, адрес к счастью 32-х битный в любом случае
doc
я для юнит-тестов ищу способ работать с базой
а почему просто в транзакции не оборачивать?
Ilya
и?
Делать тест в транзакции и потом сбрасывать? Возможно это вариант
doc
Делать тест в транзакции и потом сбрасывать? Возможно это вариант
это оч эффективно. сначала создаешь схему, потом каждый тест в своей транзакции и по окончании роллбечится. можно запускать параллельно свободно
Ilya
Хотя мне бы тестовые данные а не реальную базу
doc
тестовые данные уже в коде теста надо заливать, а не заранее
Ilya
Так если у меня транзакция над реальной базой то там уже есть данные
Ilya
Или делать truncate в init?
Ilya
Как то это того...
doc
Так если у меня транзакция над реальной базой то там уже есть данные
поясни? если что вложенные транзакции работают
doc
для тестов отдельно схему создавай и дропай по окончании тестов
Ilya
Ну мне нужна чистая база в которую я положу тестовые данные
doc
да, новые создавай, накатывай таблицы, и после тестов дропай
doc
главное, чтобы тесты были независимые
Ilya
Забыл про схемы)
doc
каждый создавал свои данные, проходил как один так и со всеми вместе, успешность тестов не зависела от порядка прохождения тестов и тд
doc
тогда это хорошие тесты)
Ilya
Согласен)
Pawel
если надо адрес первого элемента в слайсе, так можно - uintptr(unsafe.Pointer(&b[0])) ?
Nikita
если надо адрес первого элемента в слайсе, так можно - uintptr(unsafe.Pointer(&b[0])) ?
У массива думаю, что да. А у слайса сначала надо выковырять reflect.SliceHeader где уже адрес данных
Pawel
header := *(*reflect.SliceHeader)(unsafe.Pointer(&b)) ?
Nikita
LE, адрес к счастью 32-х битный в любом случае
Кстати bytes := make([]byte, 4) binary.LittleEndian.PutUint32(bytes, 0xB15B00B5)
Artem
Кто нить юзает Pgx? я вот читал мол там на каждый запрос сначала отсылается prepared statement. То есть судя по всему от SQL Injections я буду защищен и мне можно вообще забить на почти все првоерки?
Nikita
Кто нить юзает Pgx? я вот читал мол там на каждый запрос сначала отсылается prepared statement. То есть судя по всему от SQL Injections я буду защищен и мне можно вообще забить на почти все првоерки?
Чтобы защититься от иньекций, тебе вместо встраивания данных в запрос, надо просто передавать их как плейсхолдеры $1, $2.. $N
Artem
а имя таблицы можно так передать? ну типа Select * from $1 where … ?
Nikita
да. я так и передаю.
Потому что тогда подстановку выполняет сама бд
Artem
ну да. prepare statements
Nikita
а имя таблицы можно так передать? ну типа Select * from $1 where … ?
имя таблицы нет, как и нельзя передавать операторы, но в таких случаях, тебе нужно создавать белый список значений и подставлять только на основе их
Nikita
да. так и делаю
ну тогда все должно быть ок
Artem
все данные прогоняй через валидаторы. всегда. во всех языках и на всех базах
зачем? чем плох подход с плейсхолдерами? ну длину я могу завалидировать например. но там чот геморно все остальное валидировать
Shahzod
DROP TABLE tableName;
Artem
ну вопрос о том и был. Спасут ли плейсхолдеры и prepared statement от такого
Aleksandr
от какого?
Willy
Посоветуйте, что почитать для углубленного изучения Go? Там, reflect, unsafe, ...
Artem
от параметров вида “; drop table users; "
Aleksandr
да
Aleksandr
то есть это именно для этого и сделано
Shahzod
Никогда не доверять пользовательским данным! Они всегда дольжны проходить через валидаторы. Сергей прав
Artem
окей. есть какие нить валидаторы которые как аннотации к колбекам сервера запиливаются? А то я кастомный написал и он получился гавно с правилами вида const ListEventsIdRule = "request_id,any,nospace,minl=1,maxl=172,req"
doc
валидаторы проверят как минимум тип, отсекут злонамеренно сформированные запросы с данными на граничных условиях - NaN, огромные числа/строки, битые даты
Lex
а есть для Go типа <другой язык> right way? Или вот это оно: https://golang.org/doc/effective_go.html#introduction ?
Lex
ясно ,спасибо
Michael
Привет всем. Наткнулся на один интересный случай. Я уже понял, почему так происходит, но всегда думал, что case в select не может залочиться и всегда выполнится default. Оказалось нужно внимательнее доку читать Думаю будет интересно посмотреть: https://play.golang.org/p/vblaXUZFvXY
Daniel
так залочился не селект
Daniel
залочилось то чтение из канала, которое не в селекте