server.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764
  1. // DNS server implementation.
  2. package dns
  3. import (
  4. "context"
  5. "crypto/tls"
  6. "encoding/binary"
  7. "errors"
  8. "io"
  9. "net"
  10. "strings"
  11. "sync"
  12. "time"
  13. )
  14. // Default maximum number of TCP queries before we close the socket.
  15. const maxTCPQueries = 128
  16. // aLongTimeAgo is a non-zero time, far in the past, used for
  17. // immediate cancelation of network operations.
  18. var aLongTimeAgo = time.Unix(1, 0)
  19. // Handler is implemented by any value that implements ServeDNS.
  20. type Handler interface {
  21. ServeDNS(w ResponseWriter, r *Msg)
  22. }
  23. // The HandlerFunc type is an adapter to allow the use of
  24. // ordinary functions as DNS handlers. If f is a function
  25. // with the appropriate signature, HandlerFunc(f) is a
  26. // Handler object that calls f.
  27. type HandlerFunc func(ResponseWriter, *Msg)
  28. // ServeDNS calls f(w, r).
  29. func (f HandlerFunc) ServeDNS(w ResponseWriter, r *Msg) {
  30. f(w, r)
  31. }
  32. // A ResponseWriter interface is used by an DNS handler to
  33. // construct an DNS response.
  34. type ResponseWriter interface {
  35. // LocalAddr returns the net.Addr of the server
  36. LocalAddr() net.Addr
  37. // RemoteAddr returns the net.Addr of the client that sent the current request.
  38. RemoteAddr() net.Addr
  39. // WriteMsg writes a reply back to the client.
  40. WriteMsg(*Msg) error
  41. // Write writes a raw buffer back to the client.
  42. Write([]byte) (int, error)
  43. // Close closes the connection.
  44. Close() error
  45. // TsigStatus returns the status of the Tsig.
  46. TsigStatus() error
  47. // TsigTimersOnly sets the tsig timers only boolean.
  48. TsigTimersOnly(bool)
  49. // Hijack lets the caller take over the connection.
  50. // After a call to Hijack(), the DNS package will not do anything with the connection.
  51. Hijack()
  52. }
  53. // A ConnectionStater interface is used by a DNS Handler to access TLS connection state
  54. // when available.
  55. type ConnectionStater interface {
  56. ConnectionState() *tls.ConnectionState
  57. }
  58. type response struct {
  59. closed bool // connection has been closed
  60. hijacked bool // connection has been hijacked by handler
  61. tsigTimersOnly bool
  62. tsigStatus error
  63. tsigRequestMAC string
  64. tsigSecret map[string]string // the tsig secrets
  65. udp *net.UDPConn // i/o connection if UDP was used
  66. tcp net.Conn // i/o connection if TCP was used
  67. udpSession *SessionUDP // oob data to get egress interface right
  68. writer Writer // writer to output the raw DNS bits
  69. }
  70. // HandleFailed returns a HandlerFunc that returns SERVFAIL for every request it gets.
  71. func HandleFailed(w ResponseWriter, r *Msg) {
  72. m := new(Msg)
  73. m.SetRcode(r, RcodeServerFailure)
  74. // does not matter if this write fails
  75. w.WriteMsg(m)
  76. }
  77. // ListenAndServe Starts a server on address and network specified Invoke handler
  78. // for incoming queries.
  79. func ListenAndServe(addr string, network string, handler Handler) error {
  80. server := &Server{Addr: addr, Net: network, Handler: handler}
  81. return server.ListenAndServe()
  82. }
  83. // ListenAndServeTLS acts like http.ListenAndServeTLS, more information in
  84. // http://golang.org/pkg/net/http/#ListenAndServeTLS
  85. func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler) error {
  86. cert, err := tls.LoadX509KeyPair(certFile, keyFile)
  87. if err != nil {
  88. return err
  89. }
  90. config := tls.Config{
  91. Certificates: []tls.Certificate{cert},
  92. }
  93. server := &Server{
  94. Addr: addr,
  95. Net: "tcp-tls",
  96. TLSConfig: &config,
  97. Handler: handler,
  98. }
  99. return server.ListenAndServe()
  100. }
  101. // ActivateAndServe activates a server with a listener from systemd,
  102. // l and p should not both be non-nil.
  103. // If both l and p are not nil only p will be used.
  104. // Invoke handler for incoming queries.
  105. func ActivateAndServe(l net.Listener, p net.PacketConn, handler Handler) error {
  106. server := &Server{Listener: l, PacketConn: p, Handler: handler}
  107. return server.ActivateAndServe()
  108. }
  109. // Writer writes raw DNS messages; each call to Write should send an entire message.
  110. type Writer interface {
  111. io.Writer
  112. }
  113. // Reader reads raw DNS messages; each call to ReadTCP or ReadUDP should return an entire message.
  114. type Reader interface {
  115. // ReadTCP reads a raw message from a TCP connection. Implementations may alter
  116. // connection properties, for example the read-deadline.
  117. ReadTCP(conn net.Conn, timeout time.Duration) ([]byte, error)
  118. // ReadUDP reads a raw message from a UDP connection. Implementations may alter
  119. // connection properties, for example the read-deadline.
  120. ReadUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *SessionUDP, error)
  121. }
  122. // defaultReader is an adapter for the Server struct that implements the Reader interface
  123. // using the readTCP and readUDP func of the embedded Server.
  124. type defaultReader struct {
  125. *Server
  126. }
  127. func (dr defaultReader) ReadTCP(conn net.Conn, timeout time.Duration) ([]byte, error) {
  128. return dr.readTCP(conn, timeout)
  129. }
  130. func (dr defaultReader) ReadUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *SessionUDP, error) {
  131. return dr.readUDP(conn, timeout)
  132. }
  133. // DecorateReader is a decorator hook for extending or supplanting the functionality of a Reader.
  134. // Implementations should never return a nil Reader.
  135. type DecorateReader func(Reader) Reader
  136. // DecorateWriter is a decorator hook for extending or supplanting the functionality of a Writer.
  137. // Implementations should never return a nil Writer.
  138. type DecorateWriter func(Writer) Writer
  139. // A Server defines parameters for running an DNS server.
  140. type Server struct {
  141. // Address to listen on, ":dns" if empty.
  142. Addr string
  143. // if "tcp" or "tcp-tls" (DNS over TLS) it will invoke a TCP listener, otherwise an UDP one
  144. Net string
  145. // TCP Listener to use, this is to aid in systemd's socket activation.
  146. Listener net.Listener
  147. // TLS connection configuration
  148. TLSConfig *tls.Config
  149. // UDP "Listener" to use, this is to aid in systemd's socket activation.
  150. PacketConn net.PacketConn
  151. // Handler to invoke, dns.DefaultServeMux if nil.
  152. Handler Handler
  153. // Default buffer size to use to read incoming UDP messages. If not set
  154. // it defaults to MinMsgSize (512 B).
  155. UDPSize int
  156. // The net.Conn.SetReadTimeout value for new connections, defaults to 2 * time.Second.
  157. ReadTimeout time.Duration
  158. // The net.Conn.SetWriteTimeout value for new connections, defaults to 2 * time.Second.
  159. WriteTimeout time.Duration
  160. // TCP idle timeout for multiple queries, if nil, defaults to 8 * time.Second (RFC 5966).
  161. IdleTimeout func() time.Duration
  162. // Secret(s) for Tsig map[<zonename>]<base64 secret>. The zonename must be in canonical form (lowercase, fqdn, see RFC 4034 Section 6.2).
  163. TsigSecret map[string]string
  164. // If NotifyStartedFunc is set it is called once the server has started listening.
  165. NotifyStartedFunc func()
  166. // DecorateReader is optional, allows customization of the process that reads raw DNS messages.
  167. DecorateReader DecorateReader
  168. // DecorateWriter is optional, allows customization of the process that writes raw DNS messages.
  169. DecorateWriter DecorateWriter
  170. // Maximum number of TCP queries before we close the socket. Default is maxTCPQueries (unlimited if -1).
  171. MaxTCPQueries int
  172. // Whether to set the SO_REUSEPORT socket option, allowing multiple listeners to be bound to a single address.
  173. // It is only supported on go1.11+ and when using ListenAndServe.
  174. ReusePort bool
  175. // AcceptMsgFunc will check the incoming message and will reject it early in the process.
  176. // By default DefaultMsgAcceptFunc will be used.
  177. MsgAcceptFunc MsgAcceptFunc
  178. // Shutdown handling
  179. lock sync.RWMutex
  180. started bool
  181. shutdown chan struct{}
  182. conns map[net.Conn]struct{}
  183. // A pool for UDP message buffers.
  184. udpPool sync.Pool
  185. }
  186. func (srv *Server) isStarted() bool {
  187. srv.lock.RLock()
  188. started := srv.started
  189. srv.lock.RUnlock()
  190. return started
  191. }
  192. func makeUDPBuffer(size int) func() interface{} {
  193. return func() interface{} {
  194. return make([]byte, size)
  195. }
  196. }
  197. func (srv *Server) init() {
  198. srv.shutdown = make(chan struct{})
  199. srv.conns = make(map[net.Conn]struct{})
  200. if srv.UDPSize == 0 {
  201. srv.UDPSize = MinMsgSize
  202. }
  203. if srv.MsgAcceptFunc == nil {
  204. srv.MsgAcceptFunc = DefaultMsgAcceptFunc
  205. }
  206. if srv.Handler == nil {
  207. srv.Handler = DefaultServeMux
  208. }
  209. srv.udpPool.New = makeUDPBuffer(srv.UDPSize)
  210. }
  211. func unlockOnce(l sync.Locker) func() {
  212. var once sync.Once
  213. return func() { once.Do(l.Unlock) }
  214. }
  215. // ListenAndServe starts a nameserver on the configured address in *Server.
  216. func (srv *Server) ListenAndServe() error {
  217. unlock := unlockOnce(&srv.lock)
  218. srv.lock.Lock()
  219. defer unlock()
  220. if srv.started {
  221. return &Error{err: "server already started"}
  222. }
  223. addr := srv.Addr
  224. if addr == "" {
  225. addr = ":domain"
  226. }
  227. srv.init()
  228. switch srv.Net {
  229. case "tcp", "tcp4", "tcp6":
  230. l, err := listenTCP(srv.Net, addr, srv.ReusePort)
  231. if err != nil {
  232. return err
  233. }
  234. srv.Listener = l
  235. srv.started = true
  236. unlock()
  237. return srv.serveTCP(l)
  238. case "tcp-tls", "tcp4-tls", "tcp6-tls":
  239. if srv.TLSConfig == nil || (len(srv.TLSConfig.Certificates) == 0 && srv.TLSConfig.GetCertificate == nil) {
  240. return errors.New("dns: neither Certificates nor GetCertificate set in Config")
  241. }
  242. network := strings.TrimSuffix(srv.Net, "-tls")
  243. l, err := listenTCP(network, addr, srv.ReusePort)
  244. if err != nil {
  245. return err
  246. }
  247. l = tls.NewListener(l, srv.TLSConfig)
  248. srv.Listener = l
  249. srv.started = true
  250. unlock()
  251. return srv.serveTCP(l)
  252. case "udp", "udp4", "udp6":
  253. l, err := listenUDP(srv.Net, addr, srv.ReusePort)
  254. if err != nil {
  255. return err
  256. }
  257. u := l.(*net.UDPConn)
  258. if e := setUDPSocketOptions(u); e != nil {
  259. return e
  260. }
  261. srv.PacketConn = l
  262. srv.started = true
  263. unlock()
  264. return srv.serveUDP(u)
  265. }
  266. return &Error{err: "bad network"}
  267. }
  268. // ActivateAndServe starts a nameserver with the PacketConn or Listener
  269. // configured in *Server. Its main use is to start a server from systemd.
  270. func (srv *Server) ActivateAndServe() error {
  271. unlock := unlockOnce(&srv.lock)
  272. srv.lock.Lock()
  273. defer unlock()
  274. if srv.started {
  275. return &Error{err: "server already started"}
  276. }
  277. srv.init()
  278. pConn := srv.PacketConn
  279. l := srv.Listener
  280. if pConn != nil {
  281. // Check PacketConn interface's type is valid and value
  282. // is not nil
  283. if t, ok := pConn.(*net.UDPConn); ok && t != nil {
  284. if e := setUDPSocketOptions(t); e != nil {
  285. return e
  286. }
  287. srv.started = true
  288. unlock()
  289. return srv.serveUDP(t)
  290. }
  291. }
  292. if l != nil {
  293. srv.started = true
  294. unlock()
  295. return srv.serveTCP(l)
  296. }
  297. return &Error{err: "bad listeners"}
  298. }
  299. // Shutdown shuts down a server. After a call to Shutdown, ListenAndServe and
  300. // ActivateAndServe will return.
  301. func (srv *Server) Shutdown() error {
  302. return srv.ShutdownContext(context.Background())
  303. }
  304. // ShutdownContext shuts down a server. After a call to ShutdownContext,
  305. // ListenAndServe and ActivateAndServe will return.
  306. //
  307. // A context.Context may be passed to limit how long to wait for connections
  308. // to terminate.
  309. func (srv *Server) ShutdownContext(ctx context.Context) error {
  310. srv.lock.Lock()
  311. if !srv.started {
  312. srv.lock.Unlock()
  313. return &Error{err: "server not started"}
  314. }
  315. srv.started = false
  316. if srv.PacketConn != nil {
  317. srv.PacketConn.SetReadDeadline(aLongTimeAgo) // Unblock reads
  318. }
  319. if srv.Listener != nil {
  320. srv.Listener.Close()
  321. }
  322. for rw := range srv.conns {
  323. rw.SetReadDeadline(aLongTimeAgo) // Unblock reads
  324. }
  325. srv.lock.Unlock()
  326. if testShutdownNotify != nil {
  327. testShutdownNotify.Broadcast()
  328. }
  329. var ctxErr error
  330. select {
  331. case <-srv.shutdown:
  332. case <-ctx.Done():
  333. ctxErr = ctx.Err()
  334. }
  335. if srv.PacketConn != nil {
  336. srv.PacketConn.Close()
  337. }
  338. return ctxErr
  339. }
  340. var testShutdownNotify *sync.Cond
  341. // getReadTimeout is a helper func to use system timeout if server did not intend to change it.
  342. func (srv *Server) getReadTimeout() time.Duration {
  343. if srv.ReadTimeout != 0 {
  344. return srv.ReadTimeout
  345. }
  346. return dnsTimeout
  347. }
  348. // serveTCP starts a TCP listener for the server.
  349. func (srv *Server) serveTCP(l net.Listener) error {
  350. defer l.Close()
  351. if srv.NotifyStartedFunc != nil {
  352. srv.NotifyStartedFunc()
  353. }
  354. var wg sync.WaitGroup
  355. defer func() {
  356. wg.Wait()
  357. close(srv.shutdown)
  358. }()
  359. for srv.isStarted() {
  360. rw, err := l.Accept()
  361. if err != nil {
  362. if !srv.isStarted() {
  363. return nil
  364. }
  365. if neterr, ok := err.(net.Error); ok && neterr.Temporary() {
  366. continue
  367. }
  368. return err
  369. }
  370. srv.lock.Lock()
  371. // Track the connection to allow unblocking reads on shutdown.
  372. srv.conns[rw] = struct{}{}
  373. srv.lock.Unlock()
  374. wg.Add(1)
  375. go srv.serveTCPConn(&wg, rw)
  376. }
  377. return nil
  378. }
  379. // serveUDP starts a UDP listener for the server.
  380. func (srv *Server) serveUDP(l *net.UDPConn) error {
  381. defer l.Close()
  382. if srv.NotifyStartedFunc != nil {
  383. srv.NotifyStartedFunc()
  384. }
  385. reader := Reader(defaultReader{srv})
  386. if srv.DecorateReader != nil {
  387. reader = srv.DecorateReader(reader)
  388. }
  389. var wg sync.WaitGroup
  390. defer func() {
  391. wg.Wait()
  392. close(srv.shutdown)
  393. }()
  394. rtimeout := srv.getReadTimeout()
  395. // deadline is not used here
  396. for srv.isStarted() {
  397. m, s, err := reader.ReadUDP(l, rtimeout)
  398. if err != nil {
  399. if !srv.isStarted() {
  400. return nil
  401. }
  402. if netErr, ok := err.(net.Error); ok && netErr.Temporary() {
  403. continue
  404. }
  405. return err
  406. }
  407. if len(m) < headerSize {
  408. if cap(m) == srv.UDPSize {
  409. srv.udpPool.Put(m[:srv.UDPSize])
  410. }
  411. continue
  412. }
  413. wg.Add(1)
  414. go srv.serveUDPPacket(&wg, m, l, s)
  415. }
  416. return nil
  417. }
  418. // Serve a new TCP connection.
  419. func (srv *Server) serveTCPConn(wg *sync.WaitGroup, rw net.Conn) {
  420. w := &response{tsigSecret: srv.TsigSecret, tcp: rw}
  421. if srv.DecorateWriter != nil {
  422. w.writer = srv.DecorateWriter(w)
  423. } else {
  424. w.writer = w
  425. }
  426. reader := Reader(defaultReader{srv})
  427. if srv.DecorateReader != nil {
  428. reader = srv.DecorateReader(reader)
  429. }
  430. idleTimeout := tcpIdleTimeout
  431. if srv.IdleTimeout != nil {
  432. idleTimeout = srv.IdleTimeout()
  433. }
  434. timeout := srv.getReadTimeout()
  435. limit := srv.MaxTCPQueries
  436. if limit == 0 {
  437. limit = maxTCPQueries
  438. }
  439. for q := 0; (q < limit || limit == -1) && srv.isStarted(); q++ {
  440. m, err := reader.ReadTCP(w.tcp, timeout)
  441. if err != nil {
  442. // TODO(tmthrgd): handle error
  443. break
  444. }
  445. srv.serveDNS(m, w)
  446. if w.closed {
  447. break // Close() was called
  448. }
  449. if w.hijacked {
  450. break // client will call Close() themselves
  451. }
  452. // The first read uses the read timeout, the rest use the
  453. // idle timeout.
  454. timeout = idleTimeout
  455. }
  456. if !w.hijacked {
  457. w.Close()
  458. }
  459. srv.lock.Lock()
  460. delete(srv.conns, w.tcp)
  461. srv.lock.Unlock()
  462. wg.Done()
  463. }
  464. // Serve a new UDP request.
  465. func (srv *Server) serveUDPPacket(wg *sync.WaitGroup, m []byte, u *net.UDPConn, s *SessionUDP) {
  466. w := &response{tsigSecret: srv.TsigSecret, udp: u, udpSession: s}
  467. if srv.DecorateWriter != nil {
  468. w.writer = srv.DecorateWriter(w)
  469. } else {
  470. w.writer = w
  471. }
  472. srv.serveDNS(m, w)
  473. wg.Done()
  474. }
  475. func (srv *Server) serveDNS(m []byte, w *response) {
  476. dh, off, err := unpackMsgHdr(m, 0)
  477. if err != nil {
  478. // Let client hang, they are sending crap; any reply can be used to amplify.
  479. return
  480. }
  481. req := new(Msg)
  482. req.setHdr(dh)
  483. switch action := srv.MsgAcceptFunc(dh); action {
  484. case MsgAccept:
  485. if req.unpack(dh, m, off) == nil {
  486. break
  487. }
  488. fallthrough
  489. case MsgReject, MsgRejectNotImplemented:
  490. opcode := req.Opcode
  491. req.SetRcodeFormatError(req)
  492. req.Zero = false
  493. if action == MsgRejectNotImplemented {
  494. req.Opcode = opcode
  495. req.Rcode = RcodeNotImplemented
  496. }
  497. // Are we allowed to delete any OPT records here?
  498. req.Ns, req.Answer, req.Extra = nil, nil, nil
  499. w.WriteMsg(req)
  500. fallthrough
  501. case MsgIgnore:
  502. if w.udp != nil && cap(m) == srv.UDPSize {
  503. srv.udpPool.Put(m[:srv.UDPSize])
  504. }
  505. return
  506. }
  507. w.tsigStatus = nil
  508. if w.tsigSecret != nil {
  509. if t := req.IsTsig(); t != nil {
  510. if secret, ok := w.tsigSecret[t.Hdr.Name]; ok {
  511. w.tsigStatus = TsigVerify(m, secret, "", false)
  512. } else {
  513. w.tsigStatus = ErrSecret
  514. }
  515. w.tsigTimersOnly = false
  516. w.tsigRequestMAC = req.Extra[len(req.Extra)-1].(*TSIG).MAC
  517. }
  518. }
  519. if w.udp != nil && cap(m) == srv.UDPSize {
  520. srv.udpPool.Put(m[:srv.UDPSize])
  521. }
  522. srv.Handler.ServeDNS(w, req) // Writes back to the client
  523. }
  524. func (srv *Server) readTCP(conn net.Conn, timeout time.Duration) ([]byte, error) {
  525. // If we race with ShutdownContext, the read deadline may
  526. // have been set in the distant past to unblock the read
  527. // below. We must not override it, otherwise we may block
  528. // ShutdownContext.
  529. srv.lock.RLock()
  530. if srv.started {
  531. conn.SetReadDeadline(time.Now().Add(timeout))
  532. }
  533. srv.lock.RUnlock()
  534. var length uint16
  535. if err := binary.Read(conn, binary.BigEndian, &length); err != nil {
  536. return nil, err
  537. }
  538. m := make([]byte, length)
  539. if _, err := io.ReadFull(conn, m); err != nil {
  540. return nil, err
  541. }
  542. return m, nil
  543. }
  544. func (srv *Server) readUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *SessionUDP, error) {
  545. srv.lock.RLock()
  546. if srv.started {
  547. // See the comment in readTCP above.
  548. conn.SetReadDeadline(time.Now().Add(timeout))
  549. }
  550. srv.lock.RUnlock()
  551. m := srv.udpPool.Get().([]byte)
  552. n, s, err := ReadFromSessionUDP(conn, m)
  553. if err != nil {
  554. srv.udpPool.Put(m)
  555. return nil, nil, err
  556. }
  557. m = m[:n]
  558. return m, s, nil
  559. }
  560. // WriteMsg implements the ResponseWriter.WriteMsg method.
  561. func (w *response) WriteMsg(m *Msg) (err error) {
  562. if w.closed {
  563. return &Error{err: "WriteMsg called after Close"}
  564. }
  565. var data []byte
  566. if w.tsigSecret != nil { // if no secrets, dont check for the tsig (which is a longer check)
  567. if t := m.IsTsig(); t != nil {
  568. data, w.tsigRequestMAC, err = TsigGenerate(m, w.tsigSecret[t.Hdr.Name], w.tsigRequestMAC, w.tsigTimersOnly)
  569. if err != nil {
  570. return err
  571. }
  572. _, err = w.writer.Write(data)
  573. return err
  574. }
  575. }
  576. data, err = m.Pack()
  577. if err != nil {
  578. return err
  579. }
  580. _, err = w.writer.Write(data)
  581. return err
  582. }
  583. // Write implements the ResponseWriter.Write method.
  584. func (w *response) Write(m []byte) (int, error) {
  585. if w.closed {
  586. return 0, &Error{err: "Write called after Close"}
  587. }
  588. switch {
  589. case w.udp != nil:
  590. return WriteToSessionUDP(w.udp, m, w.udpSession)
  591. case w.tcp != nil:
  592. if len(m) > MaxMsgSize {
  593. return 0, &Error{err: "message too large"}
  594. }
  595. l := make([]byte, 2)
  596. binary.BigEndian.PutUint16(l, uint16(len(m)))
  597. n, err := (&net.Buffers{l, m}).WriteTo(w.tcp)
  598. return int(n), err
  599. default:
  600. panic("dns: internal error: udp and tcp both nil")
  601. }
  602. }
  603. // LocalAddr implements the ResponseWriter.LocalAddr method.
  604. func (w *response) LocalAddr() net.Addr {
  605. switch {
  606. case w.udp != nil:
  607. return w.udp.LocalAddr()
  608. case w.tcp != nil:
  609. return w.tcp.LocalAddr()
  610. default:
  611. panic("dns: internal error: udp and tcp both nil")
  612. }
  613. }
  614. // RemoteAddr implements the ResponseWriter.RemoteAddr method.
  615. func (w *response) RemoteAddr() net.Addr {
  616. switch {
  617. case w.udpSession != nil:
  618. return w.udpSession.RemoteAddr()
  619. case w.tcp != nil:
  620. return w.tcp.RemoteAddr()
  621. default:
  622. panic("dns: internal error: udpSession and tcp both nil")
  623. }
  624. }
  625. // TsigStatus implements the ResponseWriter.TsigStatus method.
  626. func (w *response) TsigStatus() error { return w.tsigStatus }
  627. // TsigTimersOnly implements the ResponseWriter.TsigTimersOnly method.
  628. func (w *response) TsigTimersOnly(b bool) { w.tsigTimersOnly = b }
  629. // Hijack implements the ResponseWriter.Hijack method.
  630. func (w *response) Hijack() { w.hijacked = true }
  631. // Close implements the ResponseWriter.Close method
  632. func (w *response) Close() error {
  633. if w.closed {
  634. return &Error{err: "connection already closed"}
  635. }
  636. w.closed = true
  637. switch {
  638. case w.udp != nil:
  639. // Can't close the udp conn, as that is actually the listener.
  640. return nil
  641. case w.tcp != nil:
  642. return w.tcp.Close()
  643. default:
  644. panic("dns: internal error: udp and tcp both nil")
  645. }
  646. }
  647. // ConnectionState() implements the ConnectionStater.ConnectionState() interface.
  648. func (w *response) ConnectionState() *tls.ConnectionState {
  649. type tlsConnectionStater interface {
  650. ConnectionState() tls.ConnectionState
  651. }
  652. if v, ok := w.tcp.(tlsConnectionStater); ok {
  653. t := v.ConnectionState()
  654. return &t
  655. }
  656. return nil
  657. }