Telegram Group & Telegram Channel
🛠 Создание собственного ResponseWriter: безопасный HTTP в Go

*Автор: Антонио Питаси*
*Источник: [anto.pt](https://anto.pt/articles/go-http-responsewriter)*

📌 Основная идея

В Go интерфейс http.ResponseWriter напрямую записывает данные в сокет, что может приводить к незаметным ошибкам:

• Забывание установки кода состояния ответа.
• Попытка изменить заголовки после начала записи (это не вызовет ошибок, но и не сработает).
• Продолжение выполнения обработчика даже после ошибок, что может повлиять на корректность ответа.

Решение: создать собственную обёртку для ResponseWriter, чтобы добавить проверки и сделать обработку HTTP-запросов более безопасной и предсказуемой.

⚠️ Проблемы стандартного ResponseWriter

1️⃣ Автоматическая установка кода состояния:
Go сам устанавливает код 200 OK при первом вызове Write(), если вы забыли явно вызвать WriteHeader(). Это скрывает ошибки.

2️⃣ Изменение заголовков после начала записи:
После начала отправки тела ответа заголовки нельзя изменить. Go не сигнализирует об этом явно.

3️⃣ Выполнение после ошибок:
Обработчик продолжает выполнение даже после отправки ошибки, если вы забыли поставить return.

## 🧱 Пример реализации обёртки


type HttpWriter struct {
w http.ResponseWriter
headerWritten bool
statusCode int
}

func NewHttpWriter(w http.ResponseWriter) http.ResponseWriter {
return &HttpWriter{w: w}
}

func (w *HttpWriter) Header() http.Header {
return w.w.Header()
}

func (w *HttpWriter) WriteHeader(statusCode int) {
w.w.WriteHeader(statusCode)
w.headerWritten = true
w.statusCode = statusCode
}

func (w *HttpWriter) Write(data []byte) (int, error) {
if !w.headerWritten {
log.Println("⚠️ Предупреждение: Write() вызван без предварительного WriteHeader()")
}
if w.statusCode >= 500 {
log.Println("⚠️ Статус 500: запись игнорируется")
return 0, nil
}
return w.w.Write(data)
}


## 🔄 Интеграция через middleware

Чтобы все обработчики автоматически использовали новый HttpWriter, можно внедрить его через middleware:


func middleware(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
writer := NewHttpWriter(w)
h.ServeHTTP(writer, r)
})
}


Преимущества

• Явное требование установки кода состояния.
• Логирование попыток записи без WriteHeader().
• Блокировка записи при статусах >=500 для предотвращения некорректного ответа.
• Улучшенная предсказуемость и безопасность обработки HTTP-запросов.

🔗 Подробнее в оригинальной статье



tg-me.com/golang_books/971
Create:
Last Update:

🛠 Создание собственного ResponseWriter: безопасный HTTP в Go

*Автор: Антонио Питаси*
*Источник: [anto.pt](https://anto.pt/articles/go-http-responsewriter)*

📌 Основная идея

В Go интерфейс http.ResponseWriter напрямую записывает данные в сокет, что может приводить к незаметным ошибкам:

• Забывание установки кода состояния ответа.
• Попытка изменить заголовки после начала записи (это не вызовет ошибок, но и не сработает).
• Продолжение выполнения обработчика даже после ошибок, что может повлиять на корректность ответа.

Решение: создать собственную обёртку для ResponseWriter, чтобы добавить проверки и сделать обработку HTTP-запросов более безопасной и предсказуемой.

⚠️ Проблемы стандартного ResponseWriter

1️⃣ Автоматическая установка кода состояния:
Go сам устанавливает код 200 OK при первом вызове Write(), если вы забыли явно вызвать WriteHeader(). Это скрывает ошибки.

2️⃣ Изменение заголовков после начала записи:
После начала отправки тела ответа заголовки нельзя изменить. Go не сигнализирует об этом явно.

3️⃣ Выполнение после ошибок:
Обработчик продолжает выполнение даже после отправки ошибки, если вы забыли поставить return.

## 🧱 Пример реализации обёртки


type HttpWriter struct {
w http.ResponseWriter
headerWritten bool
statusCode int
}

func NewHttpWriter(w http.ResponseWriter) http.ResponseWriter {
return &HttpWriter{w: w}
}

func (w *HttpWriter) Header() http.Header {
return w.w.Header()
}

func (w *HttpWriter) WriteHeader(statusCode int) {
w.w.WriteHeader(statusCode)
w.headerWritten = true
w.statusCode = statusCode
}

func (w *HttpWriter) Write(data []byte) (int, error) {
if !w.headerWritten {
log.Println("⚠️ Предупреждение: Write() вызван без предварительного WriteHeader()")
}
if w.statusCode >= 500 {
log.Println("⚠️ Статус 500: запись игнорируется")
return 0, nil
}
return w.w.Write(data)
}


## 🔄 Интеграция через middleware

Чтобы все обработчики автоматически использовали новый HttpWriter, можно внедрить его через middleware:


func middleware(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
writer := NewHttpWriter(w)
h.ServeHTTP(writer, r)
})
}


Преимущества

• Явное требование установки кода состояния.
• Логирование попыток записи без WriteHeader().
• Блокировка записи при статусах >=500 для предотвращения некорректного ответа.
• Улучшенная предсказуемость и безопасность обработки HTTP-запросов.

🔗 Подробнее в оригинальной статье

BY Golang Books




Share with your friend now:
tg-me.com/golang_books/971

View MORE
Open in Telegram


Golang Books Telegram | DID YOU KNOW?

Date: |

Export WhatsApp stickers to Telegram on iPhone

You can’t. What you can do, though, is use WhatsApp’s and Telegram’s web platforms to transfer stickers. It’s easy, but might take a while.Open WhatsApp in your browser, find a sticker you like in a chat, and right-click on it to save it as an image. The file won’t be a picture, though—it’s a webpage and will have a .webp extension. Don’t be scared, this is the way. Repeat this step to save as many stickers as you want.Then, open Telegram in your browser and go into your Saved messages chat. Just as you’d share a file with a friend, click the Share file button on the bottom left of the chat window (it looks like a dog-eared paper), and select the .webp files you downloaded. Click Open and you’ll see your stickers in your Saved messages chat. This is now your sticker depository. To use them, forward them as you would a message from one chat to the other: by clicking or long-pressing on the sticker, and then choosing Forward.

Find Channels On Telegram?

Telegram is an aspiring new messaging app that’s taking the world by storm. The app is free, fast, and claims to be one of the safest messengers around. It allows people to connect easily, without any boundaries.You can use channels on Telegram, which are similar to Facebook pages. If you’re wondering how to find channels on Telegram, you’re in the right place. Keep reading and you’ll find out how. Also, you’ll learn more about channels, creating channels yourself, and the difference between private and public Telegram channels.

Golang Books from sa


Telegram Golang Books
FROM USA