70 lines
1.1 KiB
Go
70 lines
1.1 KiB
Go
package store
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/url"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type TunnelRecord struct {
|
|
ID uuid.UUID
|
|
Time time.Time
|
|
URL *url.URL
|
|
Method string
|
|
Status int
|
|
SourceAddr string
|
|
|
|
RequestHeaders http.Header
|
|
RequestBodyType string
|
|
RequestBody []byte
|
|
|
|
ResponseHeaders http.Header
|
|
ResponseBodyType string
|
|
ResponseBody []byte
|
|
}
|
|
|
|
func (tr *TunnelRecord) MarshalJSON() ([]byte, error) {
|
|
type Alias TunnelRecord
|
|
return json.Marshal(&struct {
|
|
*Alias
|
|
URL string `json:"URL"`
|
|
Time string `json:"Time"`
|
|
}{
|
|
Alias: (*Alias)(tr),
|
|
URL: tr.URL.String(),
|
|
Time: tr.Time.Format(time.RFC3339),
|
|
})
|
|
}
|
|
|
|
func (tr *TunnelRecord) UnmarshalJSON(data []byte) error {
|
|
type Alias TunnelRecord
|
|
aux := &struct {
|
|
*Alias
|
|
URL string `json:"URL"`
|
|
Time string `json:"Time"`
|
|
}{
|
|
Alias: (*Alias)(tr),
|
|
}
|
|
|
|
if err := json.Unmarshal(data, &aux); err != nil {
|
|
return err
|
|
}
|
|
|
|
parsedURL, err := url.Parse(aux.URL)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
tr.URL = parsedURL
|
|
|
|
parsedTime, err := time.Parse(time.RFC3339, aux.Time)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
tr.Time = parsedTime
|
|
|
|
return nil
|
|
}
|