es
Feedback
Блог*

Блог*

Ir al canal en Telegram

Блог со звёздочкой. Много репостов, немножко программирования. Небольшое прикольное комьюнити: @decltype_chat_ptr_t Автор: @insert_reference_here

Mostrar más
1 928
Suscriptores
Sin datos24 horas
+37 días
+330 días
Archivo de publicaciones
Решил посмотреть, как же всё-таки работает reqwest @ > The WSAStartup function must be the first Windows Sockets function called by an application or DLL. <...> The application or DLL can only issue further Windows Sockets functions after successfully calling WSAStartup. Какой поганый дизайн. Мне больно.

Хотите купить у меня рекламу? Не волнуйтесь, это проходит.

Repost from Segment@tion fault
.

#prog #meme 🥲

#prog #go В стандартной библиотеке Go в пакете net/http есть тип Header, который, как следует из документации, является newtype-ом над map[string][]string. Значения этого типа хранят соответствие между заголовками в HTTP-запросе и связанной с ними информацией. Header используется в net/http.Request, а тот, в свою очередь — в net/http/httputil.ReverseProxy. Как сказано в документации: > ReverseProxy is an HTTP Handler that takes an incoming request and sends it to another server, proxying the response back to the client. До 30 апреля 2020 года там также было следующее: > ReverseProxy automatically sets the client IP as the value of the X-Forwarded-For header. If an X-Forwarded-For header already exists, the client IP is appended to the existing values. Это поведение не для всех было удобным: "In our situation, the proxy should be transparent and invisible to the servers, so we'd like the proxy not to add any headers to the HTTP requests he forwards. Unfortunately, there is no option to disable the addition of the X-Forwarded-For header." В качестве решения предлагалось либо добавить явную опцию для подавления этого поведения, включённую по умолчанию, либо добавить хук, который бы редактировал заголовки непосредственно перед отправкой ответа. К этому разработчики Go, как ни странно, прислушались, и в итоге исправили — правда, по своему, не использовав ни тот, ни другой из предложенных вариантов. В изменении эксплуатировался тот факт, что слайс в Go является ссылочным типом (даром, что эта терминология в документации Go не используется): слайс может быть nil, и это не то же самое, что и пустой слайс. После исправления новая документация ReverseProxy гласила следующее: > ReverseProxy by default sets the client IP as the value of the X-Forwarded-For header. If an X-Forwarded-For header already exists, the client IP is appended to the existing values. As a special case, if the header exists in the Request.Header map but has a nil value (such as when set by the Director func), the X-Forwarded-For header is not modified. Это не очень изящное решение, хотя бы потому, что неконсистентно — в большинстве других мест пустые слайсы и nil-слайсы ведут себя одинаково — и потому что заставляет пользователя ReverseProxy вручную удалять заголовок. Но оно, по крайней мере, работало. ...Или нет. Метод ReverseProxy.ServeHTTP безусловно вызывает Request.Clone, внутри которого происходит вызов Header.Clone — ручной реализации глубокого копирования Header. Фрагмент кода оттуда: sv := make([]string, nv) // shared backing array for headers' values h2 := make(Header, len(h)) for k, vv := range h { n := copy(sv, vv) h2[k] = sv[:n:n] sv = sv[n:] } return h2 Встроенная функция copy ведёт себя одинаково и в том случае, когда vv, и в том случае, когда vv nil-слайс, и возвращает в обоих случаях 0. В следующей строчке мы видим безусловное присваивание h2[k] = sv[:n:n]. Каким бы ни было значение n, нарезка слайса никогда не возвращает nil-слайс. А это значит, что в возвращённой копии Header nil-слайс будет замещён на пустой слайс, что и приводит к ошибочному поведению. В исправлении в начало тела этого цикла добавили if, который для случая, когда vv является nil, присваивает соответствующему ключу в h2 значение nil и переходит на следующую итерацию. Рядом с ним оставили комментарий: "Preserve nil values. ReverseProxy distinguishes between nil and zero-length header values". Для сравнения, у аналогичного по функционалу HeaderMap из крейта http, не смотря на более сложное устройство (и Амос объяснял, почему более сложное), вся реализация глубокого копирования сводится к #[derive(Clone)].

#rust The Ferrocene Language Specification is here! Наконец-то опубликован первый черновик спеки для Rust

https://t.me/ithueti/7283 Чат* — кузница мемов

В СМЫСЛЕ УЖЕ АВГУСТ

Чёрт, а слышать сказанные на ухо слова "Я хочу тебя" довольно приятно

#prog #typescript #abnormalprogramming https://github.com/ronami/HypeScript (thanks @randomstuffilike)

async uses a different drop checker, so rustc considers var to be dropped after .await playground issue
async uses a different drop checker, so rustc considers var to be dropped after .await playground issue

#prog #rust