mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 15:07:45 +00:00
LookupServer: Minor overhaul
- Break out request building into a DNSRequest class. - Break out response parsing into a DNSResponse class. A DNSRequest contains one or more DNSQuestion objects. A DNSResponse contains all the DNSQuestions asked, and a DNSAnswer object for each answer.
This commit is contained in:
parent
f24173b0f1
commit
871b6b4e1a
10 changed files with 343 additions and 181 deletions
49
Servers/LookupServer/DNSRequest.cpp
Normal file
49
Servers/LookupServer/DNSRequest.cpp
Normal file
|
@ -0,0 +1,49 @@
|
|||
#include "DNSRequest.h"
|
||||
#include "DNSPacket.h"
|
||||
#include <AK/BufferStream.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#define C_IN 1
|
||||
|
||||
static u16 s_next_id = 0;
|
||||
|
||||
DNSRequest::DNSRequest()
|
||||
: m_id(s_next_id++)
|
||||
{
|
||||
}
|
||||
|
||||
void DNSRequest::add_question(const String& name, u16 record_type)
|
||||
{
|
||||
ASSERT(m_questions.size() <= UINT16_MAX);
|
||||
m_questions.empend(name, record_type, C_IN);
|
||||
}
|
||||
|
||||
ByteBuffer DNSRequest::to_byte_buffer() const
|
||||
{
|
||||
DNSPacket request_header;
|
||||
request_header.set_id(m_id);
|
||||
request_header.set_is_query();
|
||||
request_header.set_opcode(0);
|
||||
request_header.set_truncated(false);
|
||||
request_header.set_recursion_desired(true);
|
||||
request_header.set_question_count(m_questions.size());
|
||||
|
||||
auto buffer = ByteBuffer::create_uninitialized(m_questions.size() * 4096);
|
||||
BufferStream stream(buffer);
|
||||
|
||||
stream << ByteBuffer::wrap(&request_header, sizeof(request_header));
|
||||
|
||||
for (auto& question : m_questions) {
|
||||
auto parts = question.name().split('.');
|
||||
for (auto& part : parts) {
|
||||
stream << (u8)part.length();
|
||||
stream << part;
|
||||
}
|
||||
stream << '\0';
|
||||
stream << htons(question.record_type());
|
||||
stream << htons(question.class_code());
|
||||
}
|
||||
stream.snip();
|
||||
|
||||
return buffer;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue