code: func (ex *dohExchanger) Exchange(ctx context.Context, query *dns.Msg) (*dns.Msg, error) {
  	queryBuf, err := query.Pack()
  	if err != nil {
  		return nil, fmt.Errorf("failed to pack DNS query: %s", err)
  	}
  
  	// No content negotiation for now, use DNS wire format
  	buf, backendErr := ex.exchangeWireformat(queryBuf)
  	if backendErr == nil {
  		response := &dns.Msg{}
  		if err := response.Unpack(buf); err != nil {
  			return nil, fmt.Errorf("failed to unpack DNS response from body: %s", err)
  		}
  
  		response.Id = query.Id
  		return response, nil
  	}
  
  	return nil, backendErr
  }
docs: // reference: https://github.com/cloudflare/cloudflared/blob/master/tunneldns/https_upstream.go#L54