| 159 | } |
| 160 | |
| 161 | func (s *DOHServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { |
| 162 | b, err := io.ReadAll(r.Body) |
| 163 | if err != nil { |
| 164 | http.Error(w, err.Error(), 500) |
| 165 | return |
| 166 | } |
| 167 | m := &dns.Msg{} |
| 168 | if err := m.Unpack(b); err != nil { |
| 169 | http.Error(w, err.Error(), 500) |
| 170 | return |
| 171 | } |
| 172 | done, err := DOHGate(m, w, r) |
| 173 | if err != nil { |
| 174 | http.Error(w, err.Error(), 500) |
| 175 | return |
| 176 | } |
| 177 | if done { |
| 178 | return |
| 179 | } |
| 180 | m1 := &dns.Msg{} |
| 181 | if s.DNSClient != nil { |
| 182 | m1, err = s.DNSClient.Exchange(m) |
| 183 | } |
| 184 | if s.DOHClient != nil { |
| 185 | m1, err = s.DOHClient.Exchange(m) |
| 186 | } |
| 187 | if err != nil { |
| 188 | http.Error(w, err.Error(), 500) |
| 189 | return |
| 190 | } |
| 191 | b, err = m1.Pack() |
| 192 | if err != nil { |
| 193 | http.Error(w, err.Error(), 500) |
| 194 | return |
| 195 | } |
| 196 | w.Header().Set("Content-Type", "application/dns-message") |
| 197 | w.Write(b) |
| 198 | } |
| 199 | |
| 200 | func (s *DOHServer) Shutdown() error { |
| 201 | return s.HTTPServer.Shutdown(context.Background()) |