mirror of
https://github.com/cunnie/sslip.io.git
synced 2025-10-28 01:41:36 +08:00
QueryResponse() uses named return values
It's more of an experiment than anything else, but I like how it documents the purpose of the return value.
This commit is contained in:
@@ -53,31 +53,31 @@ func (e *DNSError) Error() string {
|
|||||||
// 78.46.204.247.33654: NS www.example.com → NS
|
// 78.46.204.247.33654: NS www.example.com → NS
|
||||||
// 78.46.204.247.33654: SOA www.example.com → SOA
|
// 78.46.204.247.33654: SOA www.example.com → SOA
|
||||||
// 2600::.33654: AAAA --1.sslip.io → ::1
|
// 2600::.33654: AAAA --1.sslip.io → ::1
|
||||||
func QueryResponse(queryBytes []byte) ([]byte, string, error) {
|
func QueryResponse(queryBytes []byte) (responseBytes []byte, logMessage string, err error) {
|
||||||
var queryHeader dnsmessage.Header
|
var queryHeader dnsmessage.Header
|
||||||
var err error
|
|
||||||
var response []byte
|
var response []byte
|
||||||
var p dnsmessage.Parser
|
var p dnsmessage.Parser
|
||||||
|
|
||||||
if queryHeader, err = p.Start(queryBytes); err != nil {
|
if queryHeader, err = p.Start(queryBytes); err != nil {
|
||||||
return nil, "", err
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
b := dnsmessage.NewBuilder(response, ResponseHeader(queryHeader, dnsmessage.RCodeSuccess))
|
b := dnsmessage.NewBuilder(response, ResponseHeader(queryHeader, dnsmessage.RCodeSuccess))
|
||||||
b.EnableCompression()
|
b.EnableCompression()
|
||||||
if err = b.StartQuestions(); err != nil {
|
if err = b.StartQuestions(); err != nil {
|
||||||
return nil, "", err
|
return
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
q, err := p.Question()
|
var q dnsmessage.Question
|
||||||
|
q, err = p.Question()
|
||||||
if err == dnsmessage.ErrSectionDone {
|
if err == dnsmessage.ErrSectionDone {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", err
|
return
|
||||||
}
|
}
|
||||||
if err = b.Question(q); err != nil {
|
if err = b.Question(q); err != nil {
|
||||||
return nil, "", err
|
return
|
||||||
}
|
}
|
||||||
err = processQuestion(q, &b)
|
err = processQuestion(q, &b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -90,17 +90,18 @@ func QueryResponse(queryBytes []byte) ([]byte, string, error) {
|
|||||||
} else {
|
} else {
|
||||||
// processQuestion shouldn't return any error but {nil,DNSError},
|
// processQuestion shouldn't return any error but {nil,DNSError},
|
||||||
// but who knows? Someone might break contract. This is the guard.
|
// but who knows? Someone might break contract. This is the guard.
|
||||||
return nil, "", errors.New("processQuestion() returned unexpected error type")
|
err = errors.New("processQuestion() returned unexpected error type")
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
responseBytes, err := b.Finish()
|
responseBytes, err = b.Finish()
|
||||||
// I couldn't figure an easy way to test this error condition in Ginkgo
|
// I couldn't figure an easy way to test this error condition in Ginkgo
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", err
|
return
|
||||||
}
|
}
|
||||||
return responseBytes, "", nil
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func processQuestion(q dnsmessage.Question, b *dnsmessage.Builder) error {
|
func processQuestion(q dnsmessage.Question, b *dnsmessage.Builder) error {
|
||||||
|
|||||||
Reference in New Issue
Block a user