claudeevent.go 925 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package render
  2. import (
  3. "net/http"
  4. "github.com/bytedance/sonic"
  5. "github.com/bytedance/sonic/ast"
  6. "github.com/labring/aiproxy/core/common/conv"
  7. )
  8. type Anthropic struct {
  9. Event string
  10. Data []byte
  11. }
  12. func (r *Anthropic) Render(w http.ResponseWriter) error {
  13. r.WriteContentType(w)
  14. event := r.Event
  15. if event == "" {
  16. eventNode, err := sonic.GetWithOptions(r.Data, ast.SearchOptions{}, "type")
  17. if err != nil {
  18. return err
  19. }
  20. event, err = eventNode.String()
  21. if err != nil {
  22. return err
  23. }
  24. }
  25. for _, bytes := range [][]byte{
  26. eventBytes,
  27. conv.StringToBytes(event),
  28. nBytes,
  29. dataBytes,
  30. r.Data,
  31. nnBytes,
  32. } {
  33. // nosemgrep:
  34. // go.lang.security.audit.xss.no-direct-write-to-responsewriter.no-direct-write-to-responsewriter
  35. if _, err := w.Write(bytes); err != nil {
  36. return err
  37. }
  38. }
  39. return nil
  40. }
  41. func (r *Anthropic) WriteContentType(w http.ResponseWriter) {
  42. WriteSSEContentType(w)
  43. }