|
- // Copyright 2023 The casbin Authors. All Rights Reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
-
- package controllers
-
- import (
- "fmt"
- "strings"
-
- "github.com/astaxie/beego/context"
- )
-
- type RefinedWriter struct {
- context.Response
- writerCleaner Cleaner
- buf []byte
- }
-
- func newRefinedWriter(w context.Response) *RefinedWriter {
- return &RefinedWriter{w, *NewCleaner(6), []byte{}}
- }
-
- func (w *RefinedWriter) Write(p []byte) (n int, err error) {
- data := strings.TrimRight(strings.TrimLeft(string(p), "event: message\ndata: "), "\n\n")
- if w.writerCleaner.cleaned == false && w.writerCleaner.dataTimes < w.writerCleaner.bufferSize {
- w.writerCleaner.AddData(data)
- if w.writerCleaner.dataTimes == w.writerCleaner.bufferSize {
- cleanedData := w.writerCleaner.GetCleanedData()
- w.buf = append(w.buf, []byte(cleanedData)...)
- fmt.Print(cleanedData)
- return w.ResponseWriter.Write([]byte(fmt.Sprintf("event: message\ndata: %s\n\n", cleanedData)))
- }
- return 0, nil
- }
-
- w.buf = append(w.buf, []byte(data)...)
- fmt.Print(data)
- return w.ResponseWriter.Write(p)
- }
-
- func (w *RefinedWriter) String() string {
- return string(w.buf)
- }
-
- type Cleaner struct {
- dataTimes int // Number of times data is added
- buffer []string // Buffer of tokens
- bufferSize int // Size of the buffer
- cleaned bool // Whether the data has been cleaned
- }
-
- func NewCleaner(bufferSize int) *Cleaner {
- return &Cleaner{
- dataTimes: 0,
- buffer: make([]string, 0, bufferSize),
- bufferSize: bufferSize,
- cleaned: false,
- }
- }
-
- func (c *Cleaner) AddData(data string) {
- c.buffer = append(c.buffer, data)
- c.dataTimes++
- }
-
- func (c *Cleaner) GetCleanedData() string {
- c.cleaned = true
- return cleanString(strings.Join(c.buffer, ""))
- }
-
- func cleanString(data string) string {
- data = strings.Replace(data, "?", "", -1)
- data = strings.Replace(data, "?", "", -1)
-
- data = strings.Replace(data, "-", "", -1)
- data = strings.Replace(data, "——", "", -1)
-
- if strings.Contains(data, ":") {
- parts := strings.Split(data, ":")
- data = parts[len(parts)-1]
- } else if strings.Contains(data, ":") {
- parts := strings.Split(data, ":")
- data = parts[len(parts)-1]
- }
-
- data = strings.TrimSpace(data)
-
- return data
- }
|