mirror of
https://github.com/cunnie/sslip.io.git
synced 2025-10-07 00:23:44 +08:00
Extracted method processQuestion()
...because `QueryResponse()` was becoming much too big.
This commit is contained in:
170
src/xip/xip.go
170
src/xip/xip.go
@@ -52,87 +52,9 @@ func QueryResponse(queryBytes []byte) ([]byte, error) {
|
|||||||
if err = b.Question(q); err != nil {
|
if err = b.Question(q); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
switch q.Type {
|
err = processQuestion(q, &b)
|
||||||
case dnsmessage.TypeA:
|
if err != nil {
|
||||||
{
|
return nil, err
|
||||||
nameToA, err := NameToA(q.Name.String())
|
|
||||||
if err != nil {
|
|
||||||
// There's only one possible error this can be: ErrNotFound. note that
|
|
||||||
// this could be written more efficiently; however, I wrote it to
|
|
||||||
// accommodate 'if err != nil' convention. My first version was 'if
|
|
||||||
// err == nil', and it flummoxed me.
|
|
||||||
err = b.StartAuthorities()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
err = b.SOAResource(dnsmessage.ResourceHeader{
|
|
||||||
Name: q.Name,
|
|
||||||
Type: dnsmessage.TypeA,
|
|
||||||
Class: dnsmessage.ClassINET,
|
|
||||||
TTL: 604800, // 60 * 60 * 24 * 7 == 1 week; it's not gonna change
|
|
||||||
Length: 0,
|
|
||||||
}, SOAResource(q.Name.String()))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
err = b.StartAnswers()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
err = b.AResource(dnsmessage.ResourceHeader{
|
|
||||||
Name: q.Name,
|
|
||||||
Type: dnsmessage.TypeSOA,
|
|
||||||
Class: dnsmessage.ClassINET,
|
|
||||||
TTL: 604800, // 60 * 60 * 24 * 7 == 1 week; long TTL, these IP addrs don't change
|
|
||||||
Length: 0,
|
|
||||||
}, *nameToA)
|
|
||||||
if err != nil {
|
|
||||||
panic(err.Error())
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case dnsmessage.TypeAAAA:
|
|
||||||
{
|
|
||||||
nameToAAAA, err := NameToAAAA(q.Name.String())
|
|
||||||
if err != nil {
|
|
||||||
// There's only one possible error this can be: ErrNotFound. note that
|
|
||||||
// this could be written more efficiently; however, I wrote it to
|
|
||||||
// accommodate 'if err != nil' convention. My first version was 'if
|
|
||||||
// err == nil', and it flummoxed me.
|
|
||||||
err = b.StartAuthorities()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
err = b.SOAResource(dnsmessage.ResourceHeader{
|
|
||||||
Name: q.Name,
|
|
||||||
Type: dnsmessage.TypeSOA,
|
|
||||||
Class: dnsmessage.ClassINET,
|
|
||||||
TTL: 604800, // 60 * 60 * 24 * 7 == 1 week; it's not gonna change
|
|
||||||
Length: 0,
|
|
||||||
}, SOAResource(q.Name.String()))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
err = b.StartAnswers()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
err = b.AAAAResource(dnsmessage.ResourceHeader{
|
|
||||||
Name: q.Name,
|
|
||||||
Type: dnsmessage.TypeAAAA,
|
|
||||||
Class: dnsmessage.ClassINET,
|
|
||||||
TTL: 604800, // 60 * 60 * 24 * 7 == 1 week; long TTL, these IP addrs don't change
|
|
||||||
Length: 0,
|
|
||||||
}, *nameToAAAA)
|
|
||||||
if err != nil {
|
|
||||||
panic(err.Error())
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,6 +66,92 @@ func QueryResponse(queryBytes []byte) ([]byte, error) {
|
|||||||
return responseBytes, nil
|
return responseBytes, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func processQuestion(q dnsmessage.Question, b *dnsmessage.Builder) error {
|
||||||
|
switch q.Type {
|
||||||
|
case dnsmessage.TypeA:
|
||||||
|
{
|
||||||
|
nameToA, err := NameToA(q.Name.String())
|
||||||
|
if err != nil {
|
||||||
|
// There's only one possible error this can be: ErrNotFound. note that
|
||||||
|
// this could be written more efficiently; however, I wrote it to
|
||||||
|
// accommodate 'if err != nil' convention. My first version was 'if
|
||||||
|
// err == nil', and it flummoxed me.
|
||||||
|
err = b.StartAuthorities()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = b.SOAResource(dnsmessage.ResourceHeader{
|
||||||
|
Name: q.Name,
|
||||||
|
Type: dnsmessage.TypeA,
|
||||||
|
Class: dnsmessage.ClassINET,
|
||||||
|
TTL: 604800, // 60 * 60 * 24 * 7 == 1 week; it's not gonna change
|
||||||
|
Length: 0,
|
||||||
|
}, SOAResource(q.Name.String()))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = b.StartAnswers()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = b.AResource(dnsmessage.ResourceHeader{
|
||||||
|
Name: q.Name,
|
||||||
|
Type: dnsmessage.TypeSOA,
|
||||||
|
Class: dnsmessage.ClassINET,
|
||||||
|
TTL: 604800, // 60 * 60 * 24 * 7 == 1 week; long TTL, these IP addrs don't change
|
||||||
|
Length: 0,
|
||||||
|
}, *nameToA)
|
||||||
|
if err != nil {
|
||||||
|
panic(err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case dnsmessage.TypeAAAA:
|
||||||
|
{
|
||||||
|
nameToAAAA, err := NameToAAAA(q.Name.String())
|
||||||
|
if err != nil {
|
||||||
|
// There's only one possible error this can be: ErrNotFound. note that
|
||||||
|
// this could be written more efficiently; however, I wrote it to
|
||||||
|
// accommodate 'if err != nil' convention. My first version was 'if
|
||||||
|
// err == nil', and it flummoxed me.
|
||||||
|
err = b.StartAuthorities()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = b.SOAResource(dnsmessage.ResourceHeader{
|
||||||
|
Name: q.Name,
|
||||||
|
Type: dnsmessage.TypeSOA,
|
||||||
|
Class: dnsmessage.ClassINET,
|
||||||
|
TTL: 604800, // 60 * 60 * 24 * 7 == 1 week; it's not gonna change
|
||||||
|
Length: 0,
|
||||||
|
}, SOAResource(q.Name.String()))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = b.StartAnswers()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = b.AAAAResource(dnsmessage.ResourceHeader{
|
||||||
|
Name: q.Name,
|
||||||
|
Type: dnsmessage.TypeAAAA,
|
||||||
|
Class: dnsmessage.ClassINET,
|
||||||
|
TTL: 604800, // 60 * 60 * 24 * 7 == 1 week; long TTL, these IP addrs don't change
|
||||||
|
Length: 0,
|
||||||
|
}, *nameToAAAA)
|
||||||
|
if err != nil {
|
||||||
|
panic(err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// ResponseHeader returns a pre-fab DNS response header. Note that we're always
|
// ResponseHeader returns a pre-fab DNS response header. Note that we're always
|
||||||
// authoritative and therefore recursion is never available. We're able to
|
// authoritative and therefore recursion is never available. We're able to
|
||||||
// "white label" domains by indiscriminately matching every query that comes
|
// "white label" domains by indiscriminately matching every query that comes
|
||||||
|
Reference in New Issue
Block a user