feat: added support for viewing in brotli decompression

This commit is contained in:
tiny-craft 2023-10-08 23:29:43 +08:00
parent 30e7016aa3
commit b3c494f15e
6 changed files with 89 additions and 4 deletions

View File

@ -9,3 +9,6 @@ const BINARY = "Binary"
const GZIP = "GZip"
const GZIP_JSON = "GZip JSON"
const DEFLATE = "Deflate"
const DEFLATE_JSON = "Deflate JSON"
const BROTLI = "Brotli"
const BROTLI_JSON = "Brotli JSON"

View File

@ -9,6 +9,7 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/andybalholm/brotli"
"io"
"strconv"
"strings"
@ -72,7 +73,7 @@ func ConvertTo(str, targetType string) (value, resultType string) {
case types.GZIP, types.GZIP_JSON:
if gzipStr, ok := decodeGZip(str); ok {
if targetType == types.BASE64_JSON {
if targetType == types.GZIP_JSON {
value, _ = decodeJson(gzipStr)
} else {
value = gzipStr
@ -83,8 +84,29 @@ func ConvertTo(str, targetType string) (value, resultType string) {
resultType = targetType
return
case types.DEFLATE:
value, _ = decodeDeflate(str)
case types.DEFLATE, types.DEFLATE_JSON:
if deflateStr, ok := decodeDeflate(str); ok {
if targetType == types.DEFLATE_JSON {
value, _ = decodeJson(deflateStr)
} else {
value = deflateStr
}
} else {
value = str
}
resultType = targetType
return
case types.BROTLI, types.BROTLI_JSON:
if brotliStr, ok := decodeBrotli(str); ok {
if targetType == types.BROTLI_JSON {
value, _ = decodeJson(brotliStr)
} else {
value = brotliStr
}
} else {
value = str
}
resultType = targetType
return
}
@ -122,10 +144,23 @@ func autoToType(str string) (value, resultType string) {
}
if value, ok = decodeDeflate(str); ok {
if value, ok = decodeJson(value); ok {
resultType = types.DEFLATE_JSON
return
}
resultType = types.DEFLATE
return
}
if value, ok = decodeBrotli(str); ok {
if value, ok = decodeJson(value); ok {
resultType = types.BROTLI_JSON
return
}
resultType = types.BROTLI
return
}
if isBinary(str) {
if value, ok = decodeHex(str); ok {
resultType = types.HEX
@ -207,6 +242,14 @@ func decodeDeflate(str string) (string, bool) {
return str, false
}
func decodeBrotli(str string) (string, bool) {
reader := brotli.NewReader(strings.NewReader(str))
if decompressed, err := io.ReadAll(reader); err == nil {
return string(decompressed), true
}
return str, false
}
func SaveAs(str, targetType string) (value string, err error) {
switch targetType {
case types.PLAIN_TEXT:
@ -224,7 +267,7 @@ func SaveAs(str, targetType string) (value string, err error) {
binStr, _ := encodeBinary(str)
return binStr, nil
case types.JSON, types.BASE64_JSON, types.GZIP_JSON:
case types.JSON, types.BASE64_JSON, types.GZIP_JSON, types.DEFLATE_JSON, types.BROTLI_JSON:
if jsonStr, ok := encodeJson(str); ok {
switch targetType {
case types.BASE64_JSON:
@ -233,6 +276,12 @@ func SaveAs(str, targetType string) (value string, err error) {
case types.GZIP_JSON:
gzipStr, _ := encodeGZip(jsonStr)
return gzipStr, nil
case types.DEFLATE_JSON:
deflateStr, _ := encodeDeflate(jsonStr)
return deflateStr, nil
case types.BROTLI_JSON:
brotliStr, _ := encodeBrotli(jsonStr)
return brotliStr, nil
default:
return jsonStr, nil
}
@ -253,6 +302,13 @@ func SaveAs(str, targetType string) (value string, err error) {
} else {
return str, errors.New("fail to build deflate data")
}
case types.BROTLI:
if brotliStr, ok := encodeBrotli(str); ok {
return brotliStr, nil
} else {
return str, errors.New("fail to build brotli data")
}
}
return str, errors.New("fail to save with unknown error")
}
@ -332,3 +388,20 @@ func encodeDeflate(str string) (string, bool) {
}
return str, false
}
func encodeBrotli(str string) (string, bool) {
var compress = func(b []byte) (string, error) {
var buf bytes.Buffer
writer := brotli.NewWriter(&buf)
if _, err := writer.Write([]byte(str)); err != nil {
writer.Close()
return "", err
}
writer.Close()
return string(buf.Bytes()), nil
}
if brotliStr, err := compress([]byte(str)); err == nil {
return brotliStr, true
}
return str, false
}

View File

@ -67,6 +67,8 @@ const viewLanguage = computed(() => {
case types.JSON:
case types.BASE64_JSON:
case types.GZIP_JSON:
case types.DEFLATE_JSON:
case types.BROTLI_JSON:
return 'json'
default:
return 'plaintext'
@ -144,6 +146,7 @@ const onSaveValue = async () => {
:value="props.viewAs"
:options="viewOption"
style="width: 200px"
filterable
@update:value="onViewTypeUpdate" />
<div class="flex-item-expand"></div>
<n-button-group v-if="!inEdit">

View File

@ -12,4 +12,7 @@ export const types = {
GZIP: 'GZip',
GZIP_JSON: 'GZip JSON',
DEFLATE: 'Deflate',
DEFLATE_JSON: 'Deflate JSON',
BROTLI: 'Brotli',
BROTLI_JSON: 'Brotli JSON',
}

1
go.mod
View File

@ -4,6 +4,7 @@ go 1.21
require (
github.com/adrg/sysfont v0.1.2
github.com/andybalholm/brotli v1.0.5
github.com/redis/go-redis/v9 v9.2.1
github.com/vrischmann/userdir v0.0.0-20151206171402-20f291cebd68
github.com/wailsapp/wails/v2 v2.6.0

2
go.sum
View File

@ -6,6 +6,8 @@ github.com/adrg/sysfont v0.1.2/go.mod h1:6d3l7/BSjX9VaeXWJt9fcrftFaD/t7l11xgSywC
github.com/adrg/xdg v0.3.0/go.mod h1:7I2hH/IT30IsupOpKZ5ue7/qNi3CoKzD6tL3HwpaRMQ=
github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls=
github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E=
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY=
github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0=
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=