Skip to content

Commit a418182

Browse files
committed
fix: split long TXT records into 255-character chunks
1 parent 3617339 commit a418182

2 files changed

Lines changed: 50 additions & 3 deletions

File tree

internal/stackitprovider/helper.go

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,14 @@ func modifyChange(change *endpoint.Endpoint) {
7171
func getStackitRecordSetPayload(change *endpoint.Endpoint) stackitdnsclient.CreateRecordSetPayload {
7272
records := make([]stackitdnsclient.RecordPayload, len(change.Targets))
7373
for i := range change.Targets {
74+
content := change.Targets[i]
75+
76+
if change.RecordType == "TXT" {
77+
content = formatTXTContent(content)
78+
}
79+
7480
records[i] = stackitdnsclient.RecordPayload{
75-
Content: change.Targets[i],
81+
Content: content,
7682
}
7783
}
7884

@@ -88,8 +94,14 @@ func getStackitRecordSetPayload(change *endpoint.Endpoint) stackitdnsclient.Crea
8894
func getStackitPartialUpdateRecordSetPayload(change *endpoint.Endpoint) stackitdnsclient.PartialUpdateRecordSetPayload {
8995
records := make([]stackitdnsclient.RecordPayload, len(change.Targets))
9096
for i := range change.Targets {
97+
content := change.Targets[i]
98+
99+
if change.RecordType == "TXT" {
100+
content = formatTXTContent(content)
101+
}
102+
91103
records[i] = stackitdnsclient.RecordPayload{
92-
Content: change.Targets[i],
104+
Content: content,
93105
}
94106
}
95107

@@ -126,3 +138,33 @@ func safeTTLToInt32(ttl endpoint.TTL) *int32 {
126138

127139
return &v
128140
}
141+
142+
// formatTXTContent splits long TXT records into 255-character chunks separated by spaces
143+
func formatTXTContent(content string) string {
144+
cleanContent := strings.Trim(content, "\"")
145+
146+
if len(cleanContent) <= 255 {
147+
return `"` + cleanContent + `"`
148+
}
149+
150+
var chunks []string
151+
for i := 0; i < len(cleanContent); i += 255 {
152+
end := i + 255
153+
if end > len(cleanContent) {
154+
end = len(cleanContent)
155+
}
156+
chunks = append(chunks, `"`+cleanContent[i:end]+`"`)
157+
}
158+
159+
return strings.Join(chunks, " ")
160+
}
161+
162+
// unformatTXTContent reverses the DNS chunking and quoting process
163+
func unformatTXTContent(content string) string {
164+
if !strings.HasPrefix(content, "\"") || !strings.HasSuffix(content, "\"") {
165+
return content
166+
}
167+
168+
trimmed := content[1 : len(content)-1]
169+
return strings.ReplaceAll(trimmed, `" "`, "")
170+
}

internal/stackitprovider/records.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,12 @@ func endpointsFromRecords(name, recordType string, ttl endpoint.TTL, records []s
114114
for i := range records {
115115
rec := &records[i]
116116

117-
endpoints = append(endpoints, endpoint.NewEndpointWithTTL(name, recordType, ttl, rec.Content))
117+
content := rec.Content
118+
if recordType == "TXT" {
119+
content = unformatTXTContent(content)
120+
}
121+
122+
endpoints = append(endpoints, endpoint.NewEndpointWithTTL(name, recordType, ttl, content))
118123
}
119124

120125
return endpoints

0 commit comments

Comments
 (0)