42 lines
1.2 KiB
Go
42 lines
1.2 KiB
Go
package controller
|
|
import ("strings"; "github.com/tidwall/gjson")
|
|
func detectionHTML(raw []byte, contentType string) string {
|
|
result := gjson.ParseBytes(raw)
|
|
if strings.Contains(contentType, "text/event-stream") {
|
|
result = gjson.Result{}
|
|
for line := range strings.SplitSeq(string(raw), "\n") {
|
|
if strings.HasPrefix(line, "data:") {
|
|
event := gjson.Parse(strings.TrimSpace(strings.TrimPrefix(line, "data:")))
|
|
if event.Get("type").String() == "response.completed" {
|
|
result = event.Get("response")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if result.Get("status").String() != "completed" {
|
|
return ""
|
|
}
|
|
var output strings.Builder
|
|
for _, item := range result.Get("output").Array() {
|
|
if item.Get("type").String() != "message" {
|
|
continue
|
|
}
|
|
for _, part := range item.Get("content").Array() {
|
|
if part.Get("type").String() == "output_text" {
|
|
output.WriteString(part.Get("text").String())
|
|
}
|
|
}
|
|
}
|
|
html := strings.TrimSpace(output.String())
|
|
lower := strings.ToLower(html)
|
|
start := strings.Index(lower, "<!doctype html")
|
|
if start < 0 {
|
|
start = strings.Index(lower, "<html")
|
|
}
|
|
end := strings.LastIndex(lower, "</html>")
|
|
if start < 0 || end < start || len(html) > 2<<20 {
|
|
return ""
|
|
}
|
|
return html[start : end+7]
|
|
}
|