mirror of
https://github.com/kubeshark/kubeshark.git
synced 2025-09-03 03:25:26 +00:00
Adding go lint to more modules (#738)
This commit is contained in:
37
.github/workflows/static_code_analysis.yml
vendored
37
.github/workflows/static_code_analysis.yml
vendored
@@ -48,3 +48,40 @@ jobs:
|
|||||||
version: latest
|
version: latest
|
||||||
working-directory: cli
|
working-directory: cli
|
||||||
args: --timeout=3m
|
args: --timeout=3m
|
||||||
|
|
||||||
|
- name: Go lint - acceptanceTests
|
||||||
|
uses: golangci/golangci-lint-action@v2
|
||||||
|
with:
|
||||||
|
version: latest
|
||||||
|
working-directory: acceptanceTests
|
||||||
|
args: --timeout=3m
|
||||||
|
|
||||||
|
- name: Go lint - tap/api
|
||||||
|
uses: golangci/golangci-lint-action@v2
|
||||||
|
with:
|
||||||
|
version: latest
|
||||||
|
working-directory: tap/api
|
||||||
|
|
||||||
|
- name: Go lint - tap/extensions/amqp
|
||||||
|
uses: golangci/golangci-lint-action@v2
|
||||||
|
with:
|
||||||
|
version: latest
|
||||||
|
working-directory: tap/extensions/amqp
|
||||||
|
|
||||||
|
- name: Go lint - tap/extensions/http
|
||||||
|
uses: golangci/golangci-lint-action@v2
|
||||||
|
with:
|
||||||
|
version: latest
|
||||||
|
working-directory: tap/extensions/http
|
||||||
|
|
||||||
|
- name: Go lint - tap/extensions/kafka
|
||||||
|
uses: golangci/golangci-lint-action@v2
|
||||||
|
with:
|
||||||
|
version: latest
|
||||||
|
working-directory: tap/extensions/kafka
|
||||||
|
|
||||||
|
- name: Go lint - tap/extensions/redis
|
||||||
|
uses: golangci/golangci-lint-action@v2
|
||||||
|
with:
|
||||||
|
version: latest
|
||||||
|
working-directory: tap/extensions/redis
|
||||||
|
@@ -3,7 +3,6 @@ package acceptanceTests
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -11,12 +10,10 @@ import (
|
|||||||
"os/exec"
|
"os/exec"
|
||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
|
||||||
"syscall"
|
"syscall"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gorilla/websocket"
|
|
||||||
"github.com/up9inc/mizu/shared"
|
"github.com/up9inc/mizu/shared"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -28,7 +25,6 @@ const (
|
|||||||
defaultServiceName = "httpbin"
|
defaultServiceName = "httpbin"
|
||||||
defaultEntriesCount = 50
|
defaultEntriesCount = 50
|
||||||
waitAfterTapPodsReady = 3 * time.Second
|
waitAfterTapPodsReady = 3 * time.Second
|
||||||
cleanCommandTimeout = 1 * time.Minute
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type PodDescriptor struct {
|
type PodDescriptor struct {
|
||||||
@@ -36,18 +32,6 @@ type PodDescriptor struct {
|
|||||||
Namespace string
|
Namespace string
|
||||||
}
|
}
|
||||||
|
|
||||||
func isPodDescriptorInPodArray(pods []map[string]interface{}, podDescriptor PodDescriptor) bool {
|
|
||||||
for _, pod := range pods {
|
|
||||||
podNamespace := pod["namespace"].(string)
|
|
||||||
podName := pod["name"].(string)
|
|
||||||
|
|
||||||
if podDescriptor.Namespace == podNamespace && strings.Contains(podName, podDescriptor.Name) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func getCliPath() (string, error) {
|
func getCliPath() (string, error) {
|
||||||
dir, filePathErr := os.Getwd()
|
dir, filePathErr := os.Getwd()
|
||||||
if filePathErr != nil {
|
if filePathErr != nil {
|
||||||
@@ -84,10 +68,6 @@ func getApiServerUrl(port uint16) string {
|
|||||||
return fmt.Sprintf("http://localhost:%v", port)
|
return fmt.Sprintf("http://localhost:%v", port)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getWebSocketUrl(port uint16) string {
|
|
||||||
return fmt.Sprintf("ws://localhost:%v/ws", port)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getDefaultCommandArgs() []string {
|
func getDefaultCommandArgs() []string {
|
||||||
setFlag := "--set"
|
setFlag := "--set"
|
||||||
telemetry := "telemetry=false"
|
telemetry := "telemetry=false"
|
||||||
@@ -130,20 +110,6 @@ func getDefaultConfigCommandArgs() []string {
|
|||||||
return append([]string{configCommand}, defaultCmdArgs...)
|
return append([]string{configCommand}, defaultCmdArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getDefaultCleanCommandArgs() []string {
|
|
||||||
cleanCommand := "clean"
|
|
||||||
defaultCmdArgs := getDefaultCommandArgs()
|
|
||||||
|
|
||||||
return append([]string{cleanCommand}, defaultCmdArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getDefaultViewCommandArgs() []string {
|
|
||||||
viewCommand := "view"
|
|
||||||
defaultCmdArgs := getDefaultCommandArgs()
|
|
||||||
|
|
||||||
return append([]string{viewCommand}, defaultCmdArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func runCypressTests(t *testing.T, cypressRunCmd string) {
|
func runCypressTests(t *testing.T, cypressRunCmd string) {
|
||||||
cypressCmd := exec.Command("bash", "-c", cypressRunCmd)
|
cypressCmd := exec.Command("bash", "-c", cypressRunCmd)
|
||||||
t.Logf("running command: %v", cypressCmd.String())
|
t.Logf("running command: %v", cypressCmd.String())
|
||||||
@@ -268,36 +234,6 @@ func executeHttpPostRequestWithHeaders(url string, headers map[string]string, bo
|
|||||||
return executeHttpRequest(response, requestErr)
|
return executeHttpRequest(response, requestErr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func runMizuClean() error {
|
|
||||||
cliPath, err := getCliPath()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanCmdArgs := getDefaultCleanCommandArgs()
|
|
||||||
|
|
||||||
cleanCmd := exec.Command(cliPath, cleanCmdArgs...)
|
|
||||||
|
|
||||||
commandDone := make(chan error)
|
|
||||||
go func() {
|
|
||||||
if err := cleanCmd.Run(); err != nil {
|
|
||||||
commandDone <- err
|
|
||||||
}
|
|
||||||
commandDone <- nil
|
|
||||||
}()
|
|
||||||
|
|
||||||
select {
|
|
||||||
case err = <-commandDone:
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case <-time.After(cleanCommandTimeout):
|
|
||||||
return errors.New("clean command timed out")
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func cleanupCommand(cmd *exec.Cmd) error {
|
func cleanupCommand(cmd *exec.Cmd) error {
|
||||||
if err := cmd.Process.Signal(syscall.SIGQUIT); err != nil {
|
if err := cmd.Process.Signal(syscall.SIGQUIT); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -310,17 +246,6 @@ func cleanupCommand(cmd *exec.Cmd) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getPods(tapStatusInterface interface{}) ([]map[string]interface{}, error) {
|
|
||||||
tapPodsInterface := tapStatusInterface.([]interface{})
|
|
||||||
|
|
||||||
var pods []map[string]interface{}
|
|
||||||
for _, podInterface := range tapPodsInterface {
|
|
||||||
pods = append(pods, podInterface.(map[string]interface{}))
|
|
||||||
}
|
|
||||||
|
|
||||||
return pods, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getLogsPath() (string, error) {
|
func getLogsPath() (string, error) {
|
||||||
dir, filePathErr := os.Getwd()
|
dir, filePathErr := os.Getwd()
|
||||||
if filePathErr != nil {
|
if filePathErr != nil {
|
||||||
@@ -331,77 +256,6 @@ func getLogsPath() (string, error) {
|
|||||||
return logsPath, nil
|
return logsPath, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// waitTimeout waits for the waitgroup for the specified max timeout.
|
|
||||||
// Returns true if waiting timed out.
|
|
||||||
func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool {
|
|
||||||
channel := make(chan struct{})
|
|
||||||
go func() {
|
|
||||||
defer close(channel)
|
|
||||||
wg.Wait()
|
|
||||||
}()
|
|
||||||
select {
|
|
||||||
case <-channel:
|
|
||||||
return false // completed normally
|
|
||||||
case <-time.After(timeout):
|
|
||||||
return true // timed out
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// checkEntriesAtLeast checks whether the number of entries greater than or equal to n
|
|
||||||
func checkEntriesAtLeast(entries []map[string]interface{}, n int) error {
|
|
||||||
if len(entries) < n {
|
|
||||||
return fmt.Errorf("Unexpected entries result - Expected more than %d entries", n-1)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// getDBEntries retrieves the entries from the database before the given timestamp.
|
|
||||||
// Also limits the results according to the limit parameter.
|
|
||||||
// Timeout for the WebSocket connection is defined by the timeout parameter.
|
|
||||||
func getDBEntries(timestamp int64, limit int, timeout time.Duration) (entries []map[string]interface{}, err error) {
|
|
||||||
query := fmt.Sprintf("timestamp < %d and limit(%d)", timestamp, limit)
|
|
||||||
webSocketUrl := getWebSocketUrl(defaultApiServerPort)
|
|
||||||
|
|
||||||
var connection *websocket.Conn
|
|
||||||
connection, _, err = websocket.DefaultDialer.Dial(webSocketUrl, nil)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer connection.Close()
|
|
||||||
|
|
||||||
handleWSConnection := func(wg *sync.WaitGroup) {
|
|
||||||
defer wg.Done()
|
|
||||||
for {
|
|
||||||
_, message, err := connection.ReadMessage()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var data map[string]interface{}
|
|
||||||
if err = json.Unmarshal([]byte(message), &data); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if data["messageType"] == "entry" {
|
|
||||||
entries = append(entries, data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err = connection.WriteMessage(websocket.TextMessage, []byte(query))
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
go handleWSConnection(&wg)
|
|
||||||
wg.Add(1)
|
|
||||||
|
|
||||||
waitTimeout(&wg, timeout)
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Contains(slice []string, containsValue string) bool {
|
func Contains(slice []string, containsValue string) bool {
|
||||||
for _, sliceValue := range slice {
|
for _, sliceValue := range slice {
|
||||||
if sliceValue == containsValue {
|
if sliceValue == containsValue {
|
||||||
|
@@ -40,7 +40,7 @@ var connectedWebsocketIdCounter = 0
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
websocketUpgrader.CheckOrigin = func(r *http.Request) bool { return true } // like cors for web socket
|
websocketUpgrader.CheckOrigin = func(r *http.Request) bool { return true } // like cors for web socket
|
||||||
connectedWebsockets = make(map[int]*SocketConnection, 0)
|
connectedWebsockets = make(map[int]*SocketConnection)
|
||||||
}
|
}
|
||||||
|
|
||||||
func WebSocketRoutes(app *gin.Engine, eventHandlers EventHandlers, startTime int64) {
|
func WebSocketRoutes(app *gin.Engine, eventHandlers EventHandlers, startTime int64) {
|
||||||
|
@@ -33,8 +33,12 @@ func StartServer(app *gin.Engine) {
|
|||||||
go func() {
|
go func() {
|
||||||
<-signals
|
<-signals
|
||||||
logger.Log.Infof("Shutting down...")
|
logger.Log.Infof("Shutting down...")
|
||||||
ctx, _ := context.WithTimeout(context.Background(), 5*time.Second) //nolint
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||||
_ = srv.Shutdown(ctx)
|
defer cancel()
|
||||||
|
err := srv.Shutdown(ctx)
|
||||||
|
if err != nil {
|
||||||
|
logger.Log.Errorf("%v", err)
|
||||||
|
}
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
@@ -764,7 +764,7 @@ func (provider *Provider) handleRemovalError(err error) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (provider *Provider) CreateConfigMap(ctx context.Context, namespace string, configMapName string, serializedValidationRules string, serializedContract string, serializedMizuConfig string) error {
|
func (provider *Provider) CreateConfigMap(ctx context.Context, namespace string, configMapName string, serializedValidationRules string, serializedContract string, serializedMizuConfig string) error {
|
||||||
configMapData := make(map[string]string, 0)
|
configMapData := make(map[string]string)
|
||||||
if serializedValidationRules != "" {
|
if serializedValidationRules != "" {
|
||||||
configMapData[shared.ValidationRulesFileName] = serializedValidationRules
|
configMapData[shared.ValidationRulesFileName] = serializedValidationRules
|
||||||
}
|
}
|
||||||
|
@@ -10,7 +10,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func GetNodeHostToTappedPodsMap(tappedPods []core.Pod) map[string][]core.Pod {
|
func GetNodeHostToTappedPodsMap(tappedPods []core.Pod) map[string][]core.Pod {
|
||||||
nodeToTappedPodMap := make(map[string][]core.Pod, 0)
|
nodeToTappedPodMap := make(map[string][]core.Pod)
|
||||||
for _, pod := range tappedPods {
|
for _, pod := range tappedPods {
|
||||||
minimizedPod := getMinimizedPod(pod)
|
minimizedPod := getMinimizedPod(pod)
|
||||||
|
|
||||||
|
@@ -313,7 +313,7 @@ type HTTPRequestWrapper struct {
|
|||||||
func (r *HTTPRequestWrapper) MarshalJSON() ([]byte, error) {
|
func (r *HTTPRequestWrapper) MarshalJSON() ([]byte, error) {
|
||||||
body, _ := ioutil.ReadAll(r.Request.Body)
|
body, _ := ioutil.ReadAll(r.Request.Body)
|
||||||
r.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body))
|
r.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body))
|
||||||
return json.Marshal(&struct {
|
return json.Marshal(&struct { //nolint
|
||||||
Body string `json:"Body,omitempty"`
|
Body string `json:"Body,omitempty"`
|
||||||
GetBody string `json:"GetBody,omitempty"`
|
GetBody string `json:"GetBody,omitempty"`
|
||||||
Cancel string `json:"Cancel,omitempty"`
|
Cancel string `json:"Cancel,omitempty"`
|
||||||
@@ -331,7 +331,7 @@ type HTTPResponseWrapper struct {
|
|||||||
func (r *HTTPResponseWrapper) MarshalJSON() ([]byte, error) {
|
func (r *HTTPResponseWrapper) MarshalJSON() ([]byte, error) {
|
||||||
body, _ := ioutil.ReadAll(r.Response.Body)
|
body, _ := ioutil.ReadAll(r.Response.Body)
|
||||||
r.Response.Body = ioutil.NopCloser(bytes.NewBuffer(body))
|
r.Response.Body = ioutil.NopCloser(bytes.NewBuffer(body))
|
||||||
return json.Marshal(&struct {
|
return json.Marshal(&struct { //nolint
|
||||||
Body string `json:"Body,omitempty"`
|
Body string `json:"Body,omitempty"`
|
||||||
GetBody string `json:"GetBody,omitempty"`
|
GetBody string `json:"GetBody,omitempty"`
|
||||||
Cancel string `json:"Cancel,omitempty"`
|
Cancel string `json:"Cancel,omitempty"`
|
||||||
|
@@ -24,14 +24,14 @@ var connectionMethodMap = map[int]string{
|
|||||||
61: "connection unblocked",
|
61: "connection unblocked",
|
||||||
}
|
}
|
||||||
|
|
||||||
var channelMethodMap = map[int]string{
|
// var channelMethodMap = map[int]string{
|
||||||
10: "channel open",
|
// 10: "channel open",
|
||||||
11: "channel open-ok",
|
// 11: "channel open-ok",
|
||||||
20: "channel flow",
|
// 20: "channel flow",
|
||||||
21: "channel flow-ok",
|
// 21: "channel flow-ok",
|
||||||
40: "channel close",
|
// 40: "channel close",
|
||||||
41: "channel close-ok",
|
// 41: "channel close-ok",
|
||||||
}
|
// }
|
||||||
|
|
||||||
var exchangeMethodMap = map[int]string{
|
var exchangeMethodMap = map[int]string{
|
||||||
10: "exchange declare",
|
10: "exchange declare",
|
||||||
@@ -78,14 +78,14 @@ var basicMethodMap = map[int]string{
|
|||||||
120: "basic nack",
|
120: "basic nack",
|
||||||
}
|
}
|
||||||
|
|
||||||
var txMethodMap = map[int]string{
|
// var txMethodMap = map[int]string{
|
||||||
10: "tx select",
|
// 10: "tx select",
|
||||||
11: "tx select-ok",
|
// 11: "tx select-ok",
|
||||||
20: "tx commit",
|
// 20: "tx commit",
|
||||||
21: "tx commit-ok",
|
// 21: "tx commit-ok",
|
||||||
30: "tx rollback",
|
// 30: "tx rollback",
|
||||||
31: "tx rollback-ok",
|
// 31: "tx rollback-ok",
|
||||||
}
|
// }
|
||||||
|
|
||||||
type AMQPWrapper struct {
|
type AMQPWrapper struct {
|
||||||
Method string `json:"method"`
|
Method string `json:"method"`
|
||||||
@@ -550,14 +550,12 @@ func representConnectionStart(event map[string]interface{}) []interface{} {
|
|||||||
headers := make([]api.TableData, 0)
|
headers := make([]api.TableData, 0)
|
||||||
for name, value := range event["serverProperties"].(map[string]interface{}) {
|
for name, value := range event["serverProperties"].(map[string]interface{}) {
|
||||||
var outcome string
|
var outcome string
|
||||||
switch value.(type) {
|
switch v := value.(type) {
|
||||||
case string:
|
case string:
|
||||||
outcome = value.(string)
|
outcome = v
|
||||||
break
|
|
||||||
case map[string]interface{}:
|
case map[string]interface{}:
|
||||||
x, _ := json.Marshal(value)
|
x, _ := json.Marshal(value)
|
||||||
outcome = string(x)
|
outcome = string(x)
|
||||||
break
|
|
||||||
default:
|
default:
|
||||||
panic("Unknown data type for the server property!")
|
panic("Unknown data type for the server property!")
|
||||||
}
|
}
|
||||||
|
@@ -47,7 +47,6 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co
|
|||||||
|
|
||||||
var remaining int
|
var remaining int
|
||||||
var header *HeaderFrame
|
var header *HeaderFrame
|
||||||
var body []byte
|
|
||||||
|
|
||||||
connectionInfo := &api.ConnectionInfo{
|
connectionInfo := &api.ConnectionInfo{
|
||||||
ClientIP: tcpID.SrcIP,
|
ClientIP: tcpID.SrcIP,
|
||||||
@@ -102,13 +101,10 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co
|
|||||||
eventBasicPublish.Properties = header.Properties
|
eventBasicPublish.Properties = header.Properties
|
||||||
case *BasicDeliver:
|
case *BasicDeliver:
|
||||||
eventBasicDeliver.Properties = header.Properties
|
eventBasicDeliver.Properties = header.Properties
|
||||||
default:
|
|
||||||
frame = nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case *BodyFrame:
|
case *BodyFrame:
|
||||||
// continue until terminated
|
// continue until terminated
|
||||||
body = append(body, f.Body...)
|
|
||||||
remaining -= len(f.Body)
|
remaining -= len(f.Body)
|
||||||
switch lastMethodFrameMessage.(type) {
|
switch lastMethodFrameMessage.(type) {
|
||||||
case *BasicPublish:
|
case *BasicPublish:
|
||||||
@@ -119,9 +115,6 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co
|
|||||||
eventBasicDeliver.Body = f.Body
|
eventBasicDeliver.Body = f.Body
|
||||||
superIdentifier.Protocol = &protocol
|
superIdentifier.Protocol = &protocol
|
||||||
emitAMQP(*eventBasicDeliver, amqpRequest, basicMethodMap[60], connectionInfo, superTimer.CaptureTime, emitter)
|
emitAMQP(*eventBasicDeliver, amqpRequest, basicMethodMap[60], connectionInfo, superTimer.CaptureTime, emitter)
|
||||||
default:
|
|
||||||
body = nil
|
|
||||||
frame = nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case *MethodFrame:
|
case *MethodFrame:
|
||||||
@@ -211,10 +204,6 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co
|
|||||||
}
|
}
|
||||||
superIdentifier.Protocol = &protocol
|
superIdentifier.Protocol = &protocol
|
||||||
emitAMQP(*eventConnectionClose, amqpRequest, connectionMethodMap[50], connectionInfo, superTimer.CaptureTime, emitter)
|
emitAMQP(*eventConnectionClose, amqpRequest, connectionMethodMap[50], connectionInfo, superTimer.CaptureTime, emitter)
|
||||||
|
|
||||||
default:
|
|
||||||
frame = nil
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -231,32 +220,24 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string,
|
|||||||
switch request["method"] {
|
switch request["method"] {
|
||||||
case basicMethodMap[40]:
|
case basicMethodMap[40]:
|
||||||
summary = reqDetails["exchange"].(string)
|
summary = reqDetails["exchange"].(string)
|
||||||
break
|
|
||||||
case basicMethodMap[60]:
|
case basicMethodMap[60]:
|
||||||
summary = reqDetails["exchange"].(string)
|
summary = reqDetails["exchange"].(string)
|
||||||
break
|
|
||||||
case exchangeMethodMap[10]:
|
case exchangeMethodMap[10]:
|
||||||
summary = reqDetails["exchange"].(string)
|
summary = reqDetails["exchange"].(string)
|
||||||
break
|
|
||||||
case queueMethodMap[10]:
|
case queueMethodMap[10]:
|
||||||
summary = reqDetails["queue"].(string)
|
summary = reqDetails["queue"].(string)
|
||||||
break
|
|
||||||
case connectionMethodMap[10]:
|
case connectionMethodMap[10]:
|
||||||
summary = fmt.Sprintf(
|
summary = fmt.Sprintf(
|
||||||
"%s.%s",
|
"%s.%s",
|
||||||
strconv.Itoa(int(reqDetails["versionMajor"].(float64))),
|
strconv.Itoa(int(reqDetails["versionMajor"].(float64))),
|
||||||
strconv.Itoa(int(reqDetails["versionMinor"].(float64))),
|
strconv.Itoa(int(reqDetails["versionMinor"].(float64))),
|
||||||
)
|
)
|
||||||
break
|
|
||||||
case connectionMethodMap[50]:
|
case connectionMethodMap[50]:
|
||||||
summary = reqDetails["replyText"].(string)
|
summary = reqDetails["replyText"].(string)
|
||||||
break
|
|
||||||
case queueMethodMap[20]:
|
case queueMethodMap[20]:
|
||||||
summary = reqDetails["queue"].(string)
|
summary = reqDetails["queue"].(string)
|
||||||
break
|
|
||||||
case basicMethodMap[20]:
|
case basicMethodMap[20]:
|
||||||
summary = reqDetails["queue"].(string)
|
summary = reqDetails["queue"].(string)
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
|
||||||
request["url"] = summary
|
request["url"] = summary
|
||||||
@@ -288,33 +269,25 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string,
|
|||||||
|
|
||||||
func (d dissecting) Represent(request map[string]interface{}, response map[string]interface{}) (object []byte, bodySize int64, err error) {
|
func (d dissecting) Represent(request map[string]interface{}, response map[string]interface{}) (object []byte, bodySize int64, err error) {
|
||||||
bodySize = 0
|
bodySize = 0
|
||||||
representation := make(map[string]interface{}, 0)
|
representation := make(map[string]interface{})
|
||||||
var repRequest []interface{}
|
var repRequest []interface{}
|
||||||
switch request["method"].(string) {
|
switch request["method"].(string) {
|
||||||
case basicMethodMap[40]:
|
case basicMethodMap[40]:
|
||||||
repRequest = representBasicPublish(request)
|
repRequest = representBasicPublish(request)
|
||||||
break
|
|
||||||
case basicMethodMap[60]:
|
case basicMethodMap[60]:
|
||||||
repRequest = representBasicDeliver(request)
|
repRequest = representBasicDeliver(request)
|
||||||
break
|
|
||||||
case queueMethodMap[10]:
|
case queueMethodMap[10]:
|
||||||
repRequest = representQueueDeclare(request)
|
repRequest = representQueueDeclare(request)
|
||||||
break
|
|
||||||
case exchangeMethodMap[10]:
|
case exchangeMethodMap[10]:
|
||||||
repRequest = representExchangeDeclare(request)
|
repRequest = representExchangeDeclare(request)
|
||||||
break
|
|
||||||
case connectionMethodMap[10]:
|
case connectionMethodMap[10]:
|
||||||
repRequest = representConnectionStart(request)
|
repRequest = representConnectionStart(request)
|
||||||
break
|
|
||||||
case connectionMethodMap[50]:
|
case connectionMethodMap[50]:
|
||||||
repRequest = representConnectionClose(request)
|
repRequest = representConnectionClose(request)
|
||||||
break
|
|
||||||
case queueMethodMap[20]:
|
case queueMethodMap[20]:
|
||||||
repRequest = representQueueBind(request)
|
repRequest = representQueueBind(request)
|
||||||
break
|
|
||||||
case basicMethodMap[20]:
|
case basicMethodMap[20]:
|
||||||
repRequest = representBasicConsume(request)
|
repRequest = representBasicConsume(request)
|
||||||
break
|
|
||||||
}
|
}
|
||||||
representation["request"] = repRequest
|
representation["request"] = repRequest
|
||||||
object, err = json.Marshal(representation)
|
object, err = json.Marshal(representation)
|
||||||
|
@@ -135,20 +135,6 @@ func readDecimal(r io.Reader) (v Decimal, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func readFloat32(r io.Reader) (v float32, err error) {
|
|
||||||
if err = binary.Read(r, binary.BigEndian, &v); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func readFloat64(r io.Reader) (v float64, err error) {
|
|
||||||
if err = binary.Read(r, binary.BigEndian, &v); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func readTimestamp(r io.Reader) (v time.Time, err error) {
|
func readTimestamp(r io.Reader) (v time.Time, err error) {
|
||||||
var sec int64
|
var sec int64
|
||||||
if err = binary.Read(r, binary.BigEndian, &sec); err != nil {
|
if err = binary.Read(r, binary.BigEndian, &sec); err != nil {
|
||||||
|
@@ -78,15 +78,6 @@ type Error struct {
|
|||||||
Recover bool // true when this error can be recovered by retrying later or with different parameters
|
Recover bool // true when this error can be recovered by retrying later or with different parameters
|
||||||
}
|
}
|
||||||
|
|
||||||
func newError(code uint16, text string) *Error {
|
|
||||||
return &Error{
|
|
||||||
Code: int(code),
|
|
||||||
Reason: text,
|
|
||||||
Recover: isSoftExceptionCode(int(code)),
|
|
||||||
Server: true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e Error) Error() string {
|
func (e Error) Error() string {
|
||||||
return fmt.Sprintf("Exception (%d) Reason: %q", e.Code, e.Reason)
|
return fmt.Sprintf("Exception (%d) Reason: %q", e.Code, e.Reason)
|
||||||
}
|
}
|
||||||
@@ -262,19 +253,6 @@ func (t Table) Validate() error {
|
|||||||
return validateField(t)
|
return validateField(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Heap interface for maintaining delivery tags
|
|
||||||
type tagSet []uint64
|
|
||||||
|
|
||||||
func (set tagSet) Len() int { return len(set) }
|
|
||||||
func (set tagSet) Less(i, j int) bool { return (set)[i] < (set)[j] }
|
|
||||||
func (set tagSet) Swap(i, j int) { (set)[i], (set)[j] = (set)[j], (set)[i] }
|
|
||||||
func (set *tagSet) Push(tag interface{}) { *set = append(*set, tag.(uint64)) }
|
|
||||||
func (set *tagSet) Pop() interface{} {
|
|
||||||
val := (*set)[len(*set)-1]
|
|
||||||
*set = (*set)[:len(*set)-1]
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
type Message interface {
|
type Message interface {
|
||||||
id() (uint16, uint16)
|
id() (uint16, uint16)
|
||||||
wait() bool
|
wait() bool
|
||||||
@@ -282,12 +260,6 @@ type Message interface {
|
|||||||
write(io.Writer) error
|
write(io.Writer) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type messageWithContent interface {
|
|
||||||
Message
|
|
||||||
getContent() (Properties, []byte)
|
|
||||||
setContent(Properties, []byte)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The base interface implemented as:
|
The base interface implemented as:
|
||||||
|
|
||||||
@@ -322,22 +294,6 @@ type AmqpReader struct {
|
|||||||
R io.Reader
|
R io.Reader
|
||||||
}
|
}
|
||||||
|
|
||||||
type writer struct {
|
|
||||||
w io.Writer
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implements the frame interface for Connection RPC
|
|
||||||
type protocolHeader struct{}
|
|
||||||
|
|
||||||
func (protocolHeader) write(w io.Writer) error {
|
|
||||||
_, err := w.Write([]byte{'A', 'M', 'Q', 'P', 0, 0, 9, 1})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (protocolHeader) channel() uint16 {
|
|
||||||
panic("only valid as initial handshake")
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Method frames carry the high-level protocol commands (which we call "methods").
|
Method frames carry the high-level protocol commands (which we call "methods").
|
||||||
One method frame carries one command. The method frame payload has this format:
|
One method frame carries one command. The method frame payload has this format:
|
||||||
|
@@ -6,7 +6,6 @@
|
|||||||
package amqp
|
package amqp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
@@ -15,18 +14,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (w *writer) WriteFrame(frame frame) (err error) {
|
|
||||||
if err = frame.write(w.w); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if buf, ok := w.w.(*bufio.Writer); ok {
|
|
||||||
err = buf.Flush()
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *MethodFrame) write(w io.Writer) (err error) {
|
func (f *MethodFrame) write(w io.Writer) (err error) {
|
||||||
var payload bytes.Buffer
|
var payload bytes.Buffer
|
||||||
|
|
||||||
@@ -412,5 +399,5 @@ func writeTable(w io.Writer, table Table) (err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return writeLongstr(w, string(buf.Bytes()))
|
return writeLongstr(w, buf.String())
|
||||||
}
|
}
|
||||||
|
@@ -81,7 +81,7 @@ func representSliceAsTable(slice []interface{}, selectorPrefix string) (represen
|
|||||||
selector := fmt.Sprintf("%s[%d]", selectorPrefix, i)
|
selector := fmt.Sprintf("%s[%d]", selectorPrefix, i)
|
||||||
table = append(table, api.TableData{
|
table = append(table, api.TableData{
|
||||||
Name: strconv.Itoa(i),
|
Name: strconv.Itoa(i),
|
||||||
Value: item.(interface{}),
|
Value: item,
|
||||||
Selector: selector,
|
Selector: selector,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@@ -92,11 +92,15 @@ func (d dissecting) Ping() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, counterPair *api.CounterPair, superTimer *api.SuperTimer, superIdentifier *api.SuperIdentifier, emitter api.Emitter, options *api.TrafficFilteringOptions) error {
|
func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, counterPair *api.CounterPair, superTimer *api.SuperTimer, superIdentifier *api.SuperIdentifier, emitter api.Emitter, options *api.TrafficFilteringOptions) error {
|
||||||
isHTTP2, err := checkIsHTTP2Connection(b, isClient)
|
var err error
|
||||||
|
isHTTP2, _ := checkIsHTTP2Connection(b, isClient)
|
||||||
|
|
||||||
var http2Assembler *Http2Assembler
|
var http2Assembler *Http2Assembler
|
||||||
if isHTTP2 {
|
if isHTTP2 {
|
||||||
prepareHTTP2Connection(b, isClient)
|
err = prepareHTTP2Connection(b, isClient)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
http2Assembler = createHTTP2Assembler(b)
|
http2Assembler = createHTTP2Assembler(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,7 +109,13 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co
|
|||||||
if switchingProtocolsHTTP2 {
|
if switchingProtocolsHTTP2 {
|
||||||
switchingProtocolsHTTP2 = false
|
switchingProtocolsHTTP2 = false
|
||||||
isHTTP2, err = checkIsHTTP2Connection(b, isClient)
|
isHTTP2, err = checkIsHTTP2Connection(b, isClient)
|
||||||
prepareHTTP2Connection(b, isClient)
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
err = prepareHTTP2Connection(b, isClient)
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
http2Assembler = createHTTP2Assembler(b)
|
http2Assembler = createHTTP2Assembler(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,11 +350,11 @@ func representRequest(request map[string]interface{}) (repRequest []interface{})
|
|||||||
})
|
})
|
||||||
|
|
||||||
postData, _ := request["postData"].(map[string]interface{})
|
postData, _ := request["postData"].(map[string]interface{})
|
||||||
mimeType, _ := postData["mimeType"]
|
mimeType := postData["mimeType"]
|
||||||
if mimeType == nil || len(mimeType.(string)) == 0 {
|
if mimeType == nil || len(mimeType.(string)) == 0 {
|
||||||
mimeType = "text/html"
|
mimeType = "text/html"
|
||||||
}
|
}
|
||||||
text, _ := postData["text"]
|
text := postData["text"]
|
||||||
if text != nil {
|
if text != nil {
|
||||||
repRequest = append(repRequest, api.SectionData{
|
repRequest = append(repRequest, api.SectionData{
|
||||||
Type: api.BODY,
|
Type: api.BODY,
|
||||||
@@ -424,12 +434,12 @@ func representResponse(response map[string]interface{}) (repResponse []interface
|
|||||||
})
|
})
|
||||||
|
|
||||||
content, _ := response["content"].(map[string]interface{})
|
content, _ := response["content"].(map[string]interface{})
|
||||||
mimeType, _ := content["mimeType"]
|
mimeType := content["mimeType"]
|
||||||
if mimeType == nil || len(mimeType.(string)) == 0 {
|
if mimeType == nil || len(mimeType.(string)) == 0 {
|
||||||
mimeType = "text/html"
|
mimeType = "text/html"
|
||||||
}
|
}
|
||||||
encoding, _ := content["encoding"]
|
encoding := content["encoding"]
|
||||||
text, _ := content["text"]
|
text := content["text"]
|
||||||
if text != nil {
|
if text != nil {
|
||||||
repResponse = append(repResponse, api.SectionData{
|
repResponse = append(repResponse, api.SectionData{
|
||||||
Type: api.BODY,
|
Type: api.BODY,
|
||||||
@@ -445,7 +455,7 @@ func representResponse(response map[string]interface{}) (repResponse []interface
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d dissecting) Represent(request map[string]interface{}, response map[string]interface{}) (object []byte, bodySize int64, err error) {
|
func (d dissecting) Represent(request map[string]interface{}, response map[string]interface{}) (object []byte, bodySize int64, err error) {
|
||||||
representation := make(map[string]interface{}, 0)
|
representation := make(map[string]interface{})
|
||||||
repRequest := representRequest(request)
|
repRequest := representRequest(request)
|
||||||
repResponse, bodySize := representResponse(response)
|
repResponse, bodySize := representResponse(response)
|
||||||
representation["request"] = repRequest
|
representation["request"] = repRequest
|
||||||
|
@@ -89,7 +89,7 @@ func filterResponseBody(response *http.Response, options *api.TrafficFilteringOp
|
|||||||
}
|
}
|
||||||
|
|
||||||
func filterHeaders(headers *http.Header) {
|
func filterHeaders(headers *http.Header) {
|
||||||
for key, _ := range *headers {
|
for key := range *headers {
|
||||||
if strings.ToLower(key) == userAgent {
|
if strings.ToLower(key) == userAgent {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -103,7 +103,7 @@ func filterHeaders(headers *http.Header) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getContentTypeHeaderValue(headers http.Header) string {
|
func getContentTypeHeaderValue(headers http.Header) string {
|
||||||
for key, _ := range headers {
|
for key := range headers {
|
||||||
if strings.ToLower(key) == "content-type" {
|
if strings.ToLower(key) == "content-type" {
|
||||||
return headers.Get(key)
|
return headers.Get(key)
|
||||||
}
|
}
|
||||||
|
@@ -4,7 +4,6 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math"
|
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
)
|
)
|
||||||
@@ -201,25 +200,6 @@ func newPageBuffer() *pageBuffer {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pb *pageBuffer) refTo(ref *pageRef, begin, end int64) {
|
|
||||||
length := end - begin
|
|
||||||
|
|
||||||
if length > math.MaxUint32 {
|
|
||||||
panic("reference to contiguous buffer pages exceeds the maximum size of 4 GB")
|
|
||||||
}
|
|
||||||
|
|
||||||
ref.pages = append(ref.buffer[:0], pb.pages.slice(begin, end)...)
|
|
||||||
ref.pages.ref()
|
|
||||||
ref.offset = begin
|
|
||||||
ref.length = uint32(length)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pb *pageBuffer) ref(begin, end int64) *pageRef {
|
|
||||||
ref := new(pageRef)
|
|
||||||
pb.refTo(ref, begin, end)
|
|
||||||
return ref
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pb *pageBuffer) unref() {
|
func (pb *pageBuffer) unref() {
|
||||||
pb.refc.unref(func() {
|
pb.refc.unref(func() {
|
||||||
pb.pages.unref()
|
pb.pages.unref()
|
||||||
@@ -353,12 +333,12 @@ func (pb *pageBuffer) Write(b []byte) (int, error) {
|
|||||||
free := tail.Cap() - tail.Len()
|
free := tail.Cap() - tail.Len()
|
||||||
|
|
||||||
if len(b) <= free {
|
if len(b) <= free {
|
||||||
tail.Write(b)
|
_, _ = tail.Write(b)
|
||||||
pb.length += len(b)
|
pb.length += len(b)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
tail.Write(b[:free])
|
_, _ = tail.Write(b[:free])
|
||||||
b = b[free:]
|
b = b[free:]
|
||||||
|
|
||||||
pb.length += free
|
pb.length += free
|
||||||
@@ -374,7 +354,7 @@ func (pb *pageBuffer) WriteAt(b []byte, off int64) (int, error) {
|
|||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
if n < len(b) {
|
if n < len(b) {
|
||||||
pb.Write(b[n:])
|
_, _ = pb.Write(b[n:])
|
||||||
}
|
}
|
||||||
return len(b), nil
|
return len(b), nil
|
||||||
}
|
}
|
||||||
@@ -406,12 +386,6 @@ var (
|
|||||||
|
|
||||||
type contiguousPages []*page
|
type contiguousPages []*page
|
||||||
|
|
||||||
func (pages contiguousPages) ref() {
|
|
||||||
for _, p := range pages {
|
|
||||||
p.ref()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pages contiguousPages) unref() {
|
func (pages contiguousPages) unref() {
|
||||||
for _, p := range pages {
|
for _, p := range pages {
|
||||||
p.unref()
|
p.unref()
|
||||||
@@ -480,7 +454,6 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type pageRef struct {
|
type pageRef struct {
|
||||||
buffer [2]*page
|
|
||||||
pages contiguousPages
|
pages contiguousPages
|
||||||
offset int64
|
offset int64
|
||||||
cursor int64
|
cursor int64
|
||||||
@@ -590,28 +563,6 @@ var (
|
|||||||
_ io.WriterTo = (*pageRef)(nil)
|
_ io.WriterTo = (*pageRef)(nil)
|
||||||
)
|
)
|
||||||
|
|
||||||
type pageRefAllocator struct {
|
|
||||||
refs []pageRef
|
|
||||||
head int
|
|
||||||
size int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *pageRefAllocator) newPageRef() *pageRef {
|
|
||||||
if a.head == len(a.refs) {
|
|
||||||
a.refs = make([]pageRef, a.size)
|
|
||||||
a.head = 0
|
|
||||||
}
|
|
||||||
ref := &a.refs[a.head]
|
|
||||||
a.head++
|
|
||||||
return ref
|
|
||||||
}
|
|
||||||
|
|
||||||
func unref(x interface{}) {
|
|
||||||
if r, _ := x.(interface{ unref() }); r != nil {
|
|
||||||
r.unref()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func seek(cursor, limit, offset int64, whence int) (int64, error) {
|
func seek(cursor, limit, offset int64, whence int) (int64, error) {
|
||||||
switch whence {
|
switch whence {
|
||||||
case io.SeekStart:
|
case io.SeekStart:
|
||||||
@@ -631,15 +582,3 @@ func seek(cursor, limit, offset int64, whence int) (int64, error) {
|
|||||||
}
|
}
|
||||||
return offset, nil
|
return offset, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func closeBytes(b Bytes) {
|
|
||||||
if b != nil {
|
|
||||||
b.Close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func resetBytes(b Bytes) {
|
|
||||||
if r, _ := b.(interface{ Reset() }); r != nil {
|
|
||||||
r.Reset()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -1,8 +1,6 @@
|
|||||||
package kafka
|
package kafka
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
|
|
||||||
"github.com/segmentio/kafka-go/compress"
|
"github.com/segmentio/kafka-go/compress"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -12,19 +10,3 @@ type CompressionCodec = compress.Codec
|
|||||||
|
|
||||||
// TODO: this file should probably go away once the internals of the package
|
// TODO: this file should probably go away once the internals of the package
|
||||||
// have moved to use the protocol package.
|
// have moved to use the protocol package.
|
||||||
const (
|
|
||||||
compressionCodecMask = 0x07
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
errUnknownCodec = errors.New("the compression code is invalid or its codec has not been imported")
|
|
||||||
)
|
|
||||||
|
|
||||||
// resolveCodec looks up a codec by Code()
|
|
||||||
func resolveCodec(code int8) (CompressionCodec, error) {
|
|
||||||
codec := compress.Compression(code).Codec()
|
|
||||||
if codec == nil {
|
|
||||||
return nil, errUnknownCodec
|
|
||||||
}
|
|
||||||
return codec, nil
|
|
||||||
}
|
|
||||||
|
@@ -58,14 +58,6 @@ func (d *decoder) ReadByte() (byte, error) {
|
|||||||
return c, d.err
|
return c, d.err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *decoder) done() bool {
|
|
||||||
return d.remain == 0 || d.err != nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) setCRC(table *crc32.Table) {
|
|
||||||
d.table, d.crc32 = table, 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) decodeBool(v value) {
|
func (d *decoder) decodeBool(v value) {
|
||||||
v.setBool(d.readBool())
|
v.setBool(d.readBool())
|
||||||
}
|
}
|
||||||
@@ -199,19 +191,6 @@ func (d *decoder) read(n int) []byte {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *decoder) writeTo(w io.Writer, n int) {
|
|
||||||
limit := d.remain
|
|
||||||
if n < limit {
|
|
||||||
d.remain = n
|
|
||||||
}
|
|
||||||
c, err := io.Copy(w, d)
|
|
||||||
if int(c) < n && err == nil {
|
|
||||||
err = io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
d.remain = limit - int(c)
|
|
||||||
d.setError(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) setError(err error) {
|
func (d *decoder) setError(err error) {
|
||||||
if d.err == nil && err != nil {
|
if d.err == nil && err != nil {
|
||||||
d.err = err
|
d.err = err
|
||||||
@@ -272,14 +251,6 @@ func (d *decoder) readString() string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *decoder) readVarString() string {
|
|
||||||
if n := d.readVarInt(); n < 0 {
|
|
||||||
return ""
|
|
||||||
} else {
|
|
||||||
return bytesToString(d.read(int(n)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) readCompactString() string {
|
func (d *decoder) readCompactString() string {
|
||||||
if n := d.readUnsignedVarInt(); n < 1 {
|
if n := d.readUnsignedVarInt(); n < 1 {
|
||||||
return ""
|
return ""
|
||||||
@@ -296,32 +267,6 @@ func (d *decoder) readBytes() []byte {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *decoder) readBytesTo(w io.Writer) bool {
|
|
||||||
if n := d.readInt32(); n < 0 {
|
|
||||||
return false
|
|
||||||
} else {
|
|
||||||
d.writeTo(w, int(n))
|
|
||||||
return d.err == nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) readVarBytes() []byte {
|
|
||||||
if n := d.readVarInt(); n < 0 {
|
|
||||||
return nil
|
|
||||||
} else {
|
|
||||||
return d.read(int(n))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) readVarBytesTo(w io.Writer) bool {
|
|
||||||
if n := d.readVarInt(); n < 0 {
|
|
||||||
return false
|
|
||||||
} else {
|
|
||||||
d.writeTo(w, int(n))
|
|
||||||
return d.err == nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) readCompactBytes() []byte {
|
func (d *decoder) readCompactBytes() []byte {
|
||||||
if n := d.readUnsignedVarInt(); n < 1 {
|
if n := d.readUnsignedVarInt(); n < 1 {
|
||||||
return nil
|
return nil
|
||||||
@@ -330,15 +275,6 @@ func (d *decoder) readCompactBytes() []byte {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *decoder) readCompactBytesTo(w io.Writer) bool {
|
|
||||||
if n := d.readUnsignedVarInt(); n < 1 {
|
|
||||||
return false
|
|
||||||
} else {
|
|
||||||
d.writeTo(w, int(n-1))
|
|
||||||
return d.err == nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) readVarInt() int64 {
|
func (d *decoder) readVarInt() int64 {
|
||||||
n := 11 // varints are at most 11 bytes
|
n := 11 // varints are at most 11 bytes
|
||||||
|
|
||||||
|
@@ -14,37 +14,3 @@ func discardN(r *bufio.Reader, sz int, n int) (int, error) {
|
|||||||
}
|
}
|
||||||
return sz - n, err
|
return sz - n, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func discardInt8(r *bufio.Reader, sz int) (int, error) {
|
|
||||||
return discardN(r, sz, 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func discardInt16(r *bufio.Reader, sz int) (int, error) {
|
|
||||||
return discardN(r, sz, 2)
|
|
||||||
}
|
|
||||||
|
|
||||||
func discardInt32(r *bufio.Reader, sz int) (int, error) {
|
|
||||||
return discardN(r, sz, 4)
|
|
||||||
}
|
|
||||||
|
|
||||||
func discardInt64(r *bufio.Reader, sz int) (int, error) {
|
|
||||||
return discardN(r, sz, 8)
|
|
||||||
}
|
|
||||||
|
|
||||||
func discardString(r *bufio.Reader, sz int) (int, error) {
|
|
||||||
return readStringWith(r, sz, func(r *bufio.Reader, sz int, n int) (int, error) {
|
|
||||||
if n < 0 {
|
|
||||||
return sz, nil
|
|
||||||
}
|
|
||||||
return discardN(r, sz, n)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func discardBytes(r *bufio.Reader, sz int) (int, error) {
|
|
||||||
return readBytesWith(r, sz, func(r *bufio.Reader, sz int, n int) (int, error) {
|
|
||||||
if n < 0 {
|
|
||||||
return sz, nil
|
|
||||||
}
|
|
||||||
return discardN(r, sz, n)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
@@ -3,7 +3,6 @@ package kafka
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
|
||||||
"hash/crc32"
|
"hash/crc32"
|
||||||
"io"
|
"io"
|
||||||
"reflect"
|
"reflect"
|
||||||
@@ -95,10 +94,6 @@ func (e *encoder) WriteString(s string) (int, error) {
|
|||||||
return n, nil
|
return n, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) setCRC(table *crc32.Table) {
|
|
||||||
e.table, e.crc32 = table, 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) update(b []byte) {
|
func (e *encoder) update(b []byte) {
|
||||||
if e.table != nil {
|
if e.table != nil {
|
||||||
e.crc32 = crc32.Update(e.crc32, e.table, b)
|
e.crc32 = crc32.Update(e.crc32, e.table, b)
|
||||||
@@ -133,10 +128,6 @@ func (e *encoder) encodeString(v value) {
|
|||||||
e.writeString(v.string())
|
e.writeString(v.string())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) encodeVarString(v value) {
|
|
||||||
e.writeVarString(v.string())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) encodeCompactString(v value) {
|
func (e *encoder) encodeCompactString(v value) {
|
||||||
e.writeCompactString(v.string())
|
e.writeCompactString(v.string())
|
||||||
}
|
}
|
||||||
@@ -145,10 +136,6 @@ func (e *encoder) encodeNullString(v value) {
|
|||||||
e.writeNullString(v.string())
|
e.writeNullString(v.string())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) encodeVarNullString(v value) {
|
|
||||||
e.writeVarNullString(v.string())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) encodeCompactNullString(v value) {
|
func (e *encoder) encodeCompactNullString(v value) {
|
||||||
e.writeCompactNullString(v.string())
|
e.writeCompactNullString(v.string())
|
||||||
}
|
}
|
||||||
@@ -157,10 +144,6 @@ func (e *encoder) encodeBytes(v value) {
|
|||||||
e.writeBytes(v.bytes())
|
e.writeBytes(v.bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) encodeVarBytes(v value) {
|
|
||||||
e.writeVarBytes(v.bytes())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) encodeCompactBytes(v value) {
|
func (e *encoder) encodeCompactBytes(v value) {
|
||||||
e.writeCompactBytes(v.bytes())
|
e.writeCompactBytes(v.bytes())
|
||||||
}
|
}
|
||||||
@@ -169,10 +152,6 @@ func (e *encoder) encodeNullBytes(v value) {
|
|||||||
e.writeNullBytes(v.bytes())
|
e.writeNullBytes(v.bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) encodeVarNullBytes(v value) {
|
|
||||||
e.writeVarNullBytes(v.bytes())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) encodeCompactNullBytes(v value) {
|
func (e *encoder) encodeCompactNullBytes(v value) {
|
||||||
e.writeCompactNullBytes(v.bytes())
|
e.writeCompactNullBytes(v.bytes())
|
||||||
}
|
}
|
||||||
@@ -228,37 +207,32 @@ func (e *encoder) encodeCompactNullArray(v value, elemType reflect.Type, encodeE
|
|||||||
|
|
||||||
func (e *encoder) writeInt8(i int8) {
|
func (e *encoder) writeInt8(i int8) {
|
||||||
writeInt8(e.buffer[:1], i)
|
writeInt8(e.buffer[:1], i)
|
||||||
e.Write(e.buffer[:1])
|
_, _ = e.Write(e.buffer[:1])
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) writeInt16(i int16) {
|
func (e *encoder) writeInt16(i int16) {
|
||||||
writeInt16(e.buffer[:2], i)
|
writeInt16(e.buffer[:2], i)
|
||||||
e.Write(e.buffer[:2])
|
_, _ = e.Write(e.buffer[:2])
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) writeInt32(i int32) {
|
func (e *encoder) writeInt32(i int32) {
|
||||||
writeInt32(e.buffer[:4], i)
|
writeInt32(e.buffer[:4], i)
|
||||||
e.Write(e.buffer[:4])
|
_, _ = e.Write(e.buffer[:4])
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) writeInt64(i int64) {
|
func (e *encoder) writeInt64(i int64) {
|
||||||
writeInt64(e.buffer[:8], i)
|
writeInt64(e.buffer[:8], i)
|
||||||
e.Write(e.buffer[:8])
|
_, _ = e.Write(e.buffer[:8])
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) writeString(s string) {
|
func (e *encoder) writeString(s string) {
|
||||||
e.writeInt16(int16(len(s)))
|
e.writeInt16(int16(len(s)))
|
||||||
e.WriteString(s)
|
_, _ = e.WriteString(s)
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) writeVarString(s string) {
|
|
||||||
e.writeVarInt(int64(len(s)))
|
|
||||||
e.WriteString(s)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) writeCompactString(s string) {
|
func (e *encoder) writeCompactString(s string) {
|
||||||
e.writeUnsignedVarInt(uint64(len(s)) + 1)
|
e.writeUnsignedVarInt(uint64(len(s)) + 1)
|
||||||
e.WriteString(s)
|
_, _ = e.WriteString(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) writeNullString(s string) {
|
func (e *encoder) writeNullString(s string) {
|
||||||
@@ -266,16 +240,7 @@ func (e *encoder) writeNullString(s string) {
|
|||||||
e.writeInt16(-1)
|
e.writeInt16(-1)
|
||||||
} else {
|
} else {
|
||||||
e.writeInt16(int16(len(s)))
|
e.writeInt16(int16(len(s)))
|
||||||
e.WriteString(s)
|
_, _ = e.WriteString(s)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) writeVarNullString(s string) {
|
|
||||||
if s == "" {
|
|
||||||
e.writeVarInt(-1)
|
|
||||||
} else {
|
|
||||||
e.writeVarInt(int64(len(s)))
|
|
||||||
e.WriteString(s)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -284,23 +249,18 @@ func (e *encoder) writeCompactNullString(s string) {
|
|||||||
e.writeUnsignedVarInt(0)
|
e.writeUnsignedVarInt(0)
|
||||||
} else {
|
} else {
|
||||||
e.writeUnsignedVarInt(uint64(len(s)) + 1)
|
e.writeUnsignedVarInt(uint64(len(s)) + 1)
|
||||||
e.WriteString(s)
|
_, _ = e.WriteString(s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) writeBytes(b []byte) {
|
func (e *encoder) writeBytes(b []byte) {
|
||||||
e.writeInt32(int32(len(b)))
|
e.writeInt32(int32(len(b)))
|
||||||
e.Write(b)
|
_, _ = e.Write(b)
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) writeVarBytes(b []byte) {
|
|
||||||
e.writeVarInt(int64(len(b)))
|
|
||||||
e.Write(b)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) writeCompactBytes(b []byte) {
|
func (e *encoder) writeCompactBytes(b []byte) {
|
||||||
e.writeUnsignedVarInt(uint64(len(b)) + 1)
|
e.writeUnsignedVarInt(uint64(len(b)) + 1)
|
||||||
e.Write(b)
|
_, _ = e.Write(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) writeNullBytes(b []byte) {
|
func (e *encoder) writeNullBytes(b []byte) {
|
||||||
@@ -308,16 +268,7 @@ func (e *encoder) writeNullBytes(b []byte) {
|
|||||||
e.writeInt32(-1)
|
e.writeInt32(-1)
|
||||||
} else {
|
} else {
|
||||||
e.writeInt32(int32(len(b)))
|
e.writeInt32(int32(len(b)))
|
||||||
e.Write(b)
|
_, _ = e.Write(b)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) writeVarNullBytes(b []byte) {
|
|
||||||
if b == nil {
|
|
||||||
e.writeVarInt(-1)
|
|
||||||
} else {
|
|
||||||
e.writeVarInt(int64(len(b)))
|
|
||||||
e.Write(b)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,69 +277,10 @@ func (e *encoder) writeCompactNullBytes(b []byte) {
|
|||||||
e.writeUnsignedVarInt(0)
|
e.writeUnsignedVarInt(0)
|
||||||
} else {
|
} else {
|
||||||
e.writeUnsignedVarInt(uint64(len(b)) + 1)
|
e.writeUnsignedVarInt(uint64(len(b)) + 1)
|
||||||
e.Write(b)
|
_, _ = e.Write(b)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *encoder) writeBytesFrom(b Bytes) error {
|
|
||||||
size := int64(b.Len())
|
|
||||||
e.writeInt32(int32(size))
|
|
||||||
n, err := io.Copy(e, b)
|
|
||||||
if err == nil && n != size {
|
|
||||||
err = fmt.Errorf("size of bytes does not match the number of bytes that were written (size=%d, written=%d): %w", size, n, io.ErrUnexpectedEOF)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) writeNullBytesFrom(b Bytes) error {
|
|
||||||
if b == nil {
|
|
||||||
e.writeInt32(-1)
|
|
||||||
return nil
|
|
||||||
} else {
|
|
||||||
size := int64(b.Len())
|
|
||||||
e.writeInt32(int32(size))
|
|
||||||
n, err := io.Copy(e, b)
|
|
||||||
if err == nil && n != size {
|
|
||||||
err = fmt.Errorf("size of nullable bytes does not match the number of bytes that were written (size=%d, written=%d): %w", size, n, io.ErrUnexpectedEOF)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) writeVarNullBytesFrom(b Bytes) error {
|
|
||||||
if b == nil {
|
|
||||||
e.writeVarInt(-1)
|
|
||||||
return nil
|
|
||||||
} else {
|
|
||||||
size := int64(b.Len())
|
|
||||||
e.writeVarInt(size)
|
|
||||||
n, err := io.Copy(e, b)
|
|
||||||
if err == nil && n != size {
|
|
||||||
err = fmt.Errorf("size of nullable bytes does not match the number of bytes that were written (size=%d, written=%d): %w", size, n, io.ErrUnexpectedEOF)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) writeCompactNullBytesFrom(b Bytes) error {
|
|
||||||
if b == nil {
|
|
||||||
e.writeUnsignedVarInt(0)
|
|
||||||
return nil
|
|
||||||
} else {
|
|
||||||
size := int64(b.Len())
|
|
||||||
e.writeUnsignedVarInt(uint64(size + 1))
|
|
||||||
n, err := io.Copy(e, b)
|
|
||||||
if err == nil && n != size {
|
|
||||||
err = fmt.Errorf("size of compact nullable bytes does not match the number of bytes that were written (size=%d, written=%d): %w", size, n, io.ErrUnexpectedEOF)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) writeVarInt(i int64) {
|
|
||||||
e.writeUnsignedVarInt(uint64((i << 1) ^ (i >> 63)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) writeUnsignedVarInt(i uint64) {
|
func (e *encoder) writeUnsignedVarInt(i uint64) {
|
||||||
b := e.buffer[:]
|
b := e.buffer[:]
|
||||||
n := 0
|
n := 0
|
||||||
@@ -404,7 +296,7 @@ func (e *encoder) writeUnsignedVarInt(i uint64) {
|
|||||||
n++
|
n++
|
||||||
}
|
}
|
||||||
|
|
||||||
e.Write(b[:n])
|
_, _ = e.Write(b[:n])
|
||||||
}
|
}
|
||||||
|
|
||||||
type encodeFunc func(*encoder, value)
|
type encodeFunc func(*encoder, value)
|
||||||
@@ -530,7 +422,7 @@ func structEncodeFuncOf(typ reflect.Type, version int16, flexible bool) encodeFu
|
|||||||
se := &encoder{writer: buf}
|
se := &encoder{writer: buf}
|
||||||
f.encode(se, v.fieldByIndex(f.index))
|
f.encode(se, v.fieldByIndex(f.index))
|
||||||
e.writeUnsignedVarInt(uint64(buf.Len()))
|
e.writeUnsignedVarInt(uint64(buf.Len()))
|
||||||
e.Write(buf.Bytes())
|
_, _ = e.Write(buf.Bytes())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -346,7 +346,13 @@ func representProduceRequest(data map[string]interface{}) []interface{} {
|
|||||||
})
|
})
|
||||||
|
|
||||||
obj, err := oj.ParseString(string(partitionsJson))
|
obj, err := oj.ParseString(string(partitionsJson))
|
||||||
|
if err != nil {
|
||||||
|
return rep
|
||||||
|
}
|
||||||
recordBatchPath, err := jp.ParseString(`partitionData.records.recordBatch`)
|
recordBatchPath, err := jp.ParseString(`partitionData.records.recordBatch`)
|
||||||
|
if err != nil {
|
||||||
|
return rep
|
||||||
|
}
|
||||||
recordBatchresults := recordBatchPath.Get(obj)
|
recordBatchresults := recordBatchPath.Get(obj)
|
||||||
if len(recordBatchresults) > 0 {
|
if len(recordBatchresults) > 0 {
|
||||||
rep = append(rep, api.SectionData{
|
rep = append(rep, api.SectionData{
|
||||||
@@ -357,6 +363,9 @@ func representProduceRequest(data map[string]interface{}) []interface{} {
|
|||||||
}
|
}
|
||||||
|
|
||||||
recordsPath, err := jp.ParseString(`partitionData.records.recordBatch.record`)
|
recordsPath, err := jp.ParseString(`partitionData.records.recordBatch.record`)
|
||||||
|
if err != nil {
|
||||||
|
return rep
|
||||||
|
}
|
||||||
recordsResults := recordsPath.Get(obj)
|
recordsResults := recordsPath.Get(obj)
|
||||||
if len(recordsResults) > 0 {
|
if len(recordsResults) > 0 {
|
||||||
records := recordsResults[0].([]interface{})
|
records := recordsResults[0].([]interface{})
|
||||||
|
@@ -81,10 +81,8 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string,
|
|||||||
if len(summary) > 0 {
|
if len(summary) > 0 {
|
||||||
summary = summary[:len(summary)-2]
|
summary = summary[:len(summary)-2]
|
||||||
}
|
}
|
||||||
break
|
|
||||||
case ApiVersions:
|
case ApiVersions:
|
||||||
summary = reqDetails["clientID"].(string)
|
summary = reqDetails["clientID"].(string)
|
||||||
break
|
|
||||||
case Produce:
|
case Produce:
|
||||||
_topics := reqDetails["payload"].(map[string]interface{})["topicData"]
|
_topics := reqDetails["payload"].(map[string]interface{})["topicData"]
|
||||||
if _topics == nil {
|
if _topics == nil {
|
||||||
@@ -97,7 +95,6 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string,
|
|||||||
if len(summary) > 0 {
|
if len(summary) > 0 {
|
||||||
summary = summary[:len(summary)-2]
|
summary = summary[:len(summary)-2]
|
||||||
}
|
}
|
||||||
break
|
|
||||||
case Fetch:
|
case Fetch:
|
||||||
_topics := reqDetails["payload"].(map[string]interface{})["topics"]
|
_topics := reqDetails["payload"].(map[string]interface{})["topics"]
|
||||||
if _topics == nil {
|
if _topics == nil {
|
||||||
@@ -110,7 +107,6 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string,
|
|||||||
if len(summary) > 0 {
|
if len(summary) > 0 {
|
||||||
summary = summary[:len(summary)-2]
|
summary = summary[:len(summary)-2]
|
||||||
}
|
}
|
||||||
break
|
|
||||||
case ListOffsets:
|
case ListOffsets:
|
||||||
_topics := reqDetails["payload"].(map[string]interface{})["topics"]
|
_topics := reqDetails["payload"].(map[string]interface{})["topics"]
|
||||||
if _topics == nil {
|
if _topics == nil {
|
||||||
@@ -123,7 +119,6 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string,
|
|||||||
if len(summary) > 0 {
|
if len(summary) > 0 {
|
||||||
summary = summary[:len(summary)-2]
|
summary = summary[:len(summary)-2]
|
||||||
}
|
}
|
||||||
break
|
|
||||||
case CreateTopics:
|
case CreateTopics:
|
||||||
topics := reqDetails["payload"].(map[string]interface{})["topics"].([]interface{})
|
topics := reqDetails["payload"].(map[string]interface{})["topics"].([]interface{})
|
||||||
for _, topic := range topics {
|
for _, topic := range topics {
|
||||||
@@ -132,13 +127,11 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string,
|
|||||||
if len(summary) > 0 {
|
if len(summary) > 0 {
|
||||||
summary = summary[:len(summary)-2]
|
summary = summary[:len(summary)-2]
|
||||||
}
|
}
|
||||||
break
|
|
||||||
case DeleteTopics:
|
case DeleteTopics:
|
||||||
topicNames := reqDetails["topicNames"].([]string)
|
topicNames := reqDetails["topicNames"].([]string)
|
||||||
for _, name := range topicNames {
|
for _, name := range topicNames {
|
||||||
summary += fmt.Sprintf("%s, ", name)
|
summary += fmt.Sprintf("%s, ", name)
|
||||||
}
|
}
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
|
||||||
request["url"] = summary
|
request["url"] = summary
|
||||||
@@ -173,7 +166,7 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string,
|
|||||||
|
|
||||||
func (d dissecting) Represent(request map[string]interface{}, response map[string]interface{}) (object []byte, bodySize int64, err error) {
|
func (d dissecting) Represent(request map[string]interface{}, response map[string]interface{}) (object []byte, bodySize int64, err error) {
|
||||||
bodySize = 0
|
bodySize = 0
|
||||||
representation := make(map[string]interface{}, 0)
|
representation := make(map[string]interface{})
|
||||||
|
|
||||||
apiKey := ApiKey(request["apiKey"].(float64))
|
apiKey := ApiKey(request["apiKey"].(float64))
|
||||||
|
|
||||||
@@ -183,31 +176,24 @@ func (d dissecting) Represent(request map[string]interface{}, response map[strin
|
|||||||
case Metadata:
|
case Metadata:
|
||||||
repRequest = representMetadataRequest(request)
|
repRequest = representMetadataRequest(request)
|
||||||
repResponse = representMetadataResponse(response)
|
repResponse = representMetadataResponse(response)
|
||||||
break
|
|
||||||
case ApiVersions:
|
case ApiVersions:
|
||||||
repRequest = representApiVersionsRequest(request)
|
repRequest = representApiVersionsRequest(request)
|
||||||
repResponse = representApiVersionsResponse(response)
|
repResponse = representApiVersionsResponse(response)
|
||||||
break
|
|
||||||
case Produce:
|
case Produce:
|
||||||
repRequest = representProduceRequest(request)
|
repRequest = representProduceRequest(request)
|
||||||
repResponse = representProduceResponse(response)
|
repResponse = representProduceResponse(response)
|
||||||
break
|
|
||||||
case Fetch:
|
case Fetch:
|
||||||
repRequest = representFetchRequest(request)
|
repRequest = representFetchRequest(request)
|
||||||
repResponse = representFetchResponse(response)
|
repResponse = representFetchResponse(response)
|
||||||
break
|
|
||||||
case ListOffsets:
|
case ListOffsets:
|
||||||
repRequest = representListOffsetsRequest(request)
|
repRequest = representListOffsetsRequest(request)
|
||||||
repResponse = representListOffsetsResponse(response)
|
repResponse = representListOffsetsResponse(response)
|
||||||
break
|
|
||||||
case CreateTopics:
|
case CreateTopics:
|
||||||
repRequest = representCreateTopicsRequest(request)
|
repRequest = representCreateTopicsRequest(request)
|
||||||
repResponse = representCreateTopicsResponse(response)
|
repResponse = representCreateTopicsResponse(response)
|
||||||
break
|
|
||||||
case DeleteTopics:
|
case DeleteTopics:
|
||||||
repRequest = representDeleteTopicsRequest(request)
|
repRequest = representDeleteTopicsRequest(request)
|
||||||
repResponse = representDeleteTopicsResponse(response)
|
repResponse = representDeleteTopicsResponse(response)
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
|
||||||
representation["request"] = repRequest
|
representation["request"] = repRequest
|
||||||
|
@@ -26,9 +26,9 @@ func CreateResponseRequestMatcher() requestResponseMatcher {
|
|||||||
func (matcher *requestResponseMatcher) registerRequest(key string, request *Request) *RequestResponsePair {
|
func (matcher *requestResponseMatcher) registerRequest(key string, request *Request) *RequestResponsePair {
|
||||||
if response, found := matcher.openMessagesMap.LoadAndDelete(key); found {
|
if response, found := matcher.openMessagesMap.LoadAndDelete(key); found {
|
||||||
// Check for a situation that only occurs when a Kafka broker is initiating
|
// Check for a situation that only occurs when a Kafka broker is initiating
|
||||||
switch response.(type) {
|
switch v := response.(type) {
|
||||||
case *Response:
|
case *Response:
|
||||||
return matcher.preparePair(request, response.(*Response))
|
return matcher.preparePair(request, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -167,10 +167,6 @@ type messageType struct {
|
|||||||
encode encodeFunc
|
encode encodeFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *messageType) new() Message {
|
|
||||||
return reflect.New(t.gotype).Interface().(Message)
|
|
||||||
}
|
|
||||||
|
|
||||||
type apiType struct {
|
type apiType struct {
|
||||||
requests []messageType
|
requests []messageType
|
||||||
responses []messageType
|
responses []messageType
|
||||||
@@ -389,16 +385,16 @@ func (b Broker) String() string {
|
|||||||
func (b Broker) Format(w fmt.State, v rune) {
|
func (b Broker) Format(w fmt.State, v rune) {
|
||||||
switch v {
|
switch v {
|
||||||
case 'd':
|
case 'd':
|
||||||
io.WriteString(w, itoa(b.ID))
|
_, _ = io.WriteString(w, itoa(b.ID))
|
||||||
case 's':
|
case 's':
|
||||||
io.WriteString(w, b.String())
|
_, _ = io.WriteString(w, b.String())
|
||||||
case 'v':
|
case 'v':
|
||||||
io.WriteString(w, itoa(b.ID))
|
_, _ = io.WriteString(w, itoa(b.ID))
|
||||||
io.WriteString(w, " ")
|
_, _ = io.WriteString(w, " ")
|
||||||
io.WriteString(w, b.String())
|
_, _ = io.WriteString(w, b.String())
|
||||||
if b.Rack != "" {
|
if b.Rack != "" {
|
||||||
io.WriteString(w, " ")
|
_, _ = io.WriteString(w, " ")
|
||||||
io.WriteString(w, b.Rack)
|
_, _ = io.WriteString(w, b.Rack)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -99,10 +99,8 @@ func (k apiKey) String() string {
|
|||||||
return strconv.Itoa(int(k))
|
return strconv.Itoa(int(k))
|
||||||
}
|
}
|
||||||
|
|
||||||
type apiVersion int16
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
v0 = 0
|
// v0 = 0
|
||||||
v1 = 1
|
v1 = 1
|
||||||
v2 = 2
|
v2 = 2
|
||||||
v3 = 3
|
v3 = 3
|
||||||
@@ -113,6 +111,7 @@ const (
|
|||||||
v8 = 8
|
v8 = 8
|
||||||
v9 = 9
|
v9 = 9
|
||||||
v10 = 10
|
v10 = 10
|
||||||
|
v11 = 11
|
||||||
)
|
)
|
||||||
|
|
||||||
var apiKeyStrings = [...]string{
|
var apiKeyStrings = [...]string{
|
||||||
@@ -166,35 +165,6 @@ var apiKeyStrings = [...]string{
|
|||||||
offsetDelete: "OffsetDelete",
|
offsetDelete: "OffsetDelete",
|
||||||
}
|
}
|
||||||
|
|
||||||
type requestHeader struct {
|
|
||||||
Size int32
|
|
||||||
ApiKey int16
|
|
||||||
ApiVersion int16
|
|
||||||
CorrelationID int32
|
|
||||||
ClientID string
|
|
||||||
}
|
|
||||||
|
|
||||||
func sizeofString(s string) int32 {
|
|
||||||
return 2 + int32(len(s))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h requestHeader) size() int32 {
|
|
||||||
return 4 + 2 + 2 + 4 + sizeofString(h.ClientID)
|
|
||||||
}
|
|
||||||
|
|
||||||
// func (h requestHeader) writeTo(wb *writeBuffer) {
|
|
||||||
// wb.writeInt32(h.Size)
|
|
||||||
// wb.writeInt16(h.ApiKey)
|
|
||||||
// wb.writeInt16(h.ApiVersion)
|
|
||||||
// wb.writeInt32(h.CorrelationID)
|
|
||||||
// wb.writeString(h.ClientID)
|
|
||||||
// }
|
|
||||||
|
|
||||||
type request interface {
|
|
||||||
size() int32
|
|
||||||
// writable
|
|
||||||
}
|
|
||||||
|
|
||||||
func makeInt8(b []byte) int8 {
|
func makeInt8(b []byte) int8 {
|
||||||
return int8(b[0])
|
return int8(b[0])
|
||||||
}
|
}
|
||||||
@@ -210,10 +180,3 @@ func makeInt32(b []byte) int32 {
|
|||||||
func makeInt64(b []byte) int64 {
|
func makeInt64(b []byte) int64 {
|
||||||
return int64(binary.BigEndian.Uint64(b))
|
return int64(binary.BigEndian.Uint64(b))
|
||||||
}
|
}
|
||||||
|
|
||||||
func expectZeroSize(sz int, err error) error {
|
|
||||||
if err == nil && sz != 0 {
|
|
||||||
err = fmt.Errorf("reading a response left %d unread bytes", sz)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
@@ -5,7 +5,6 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"reflect"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type readable interface {
|
type readable interface {
|
||||||
@@ -42,59 +41,6 @@ func readInt64(r *bufio.Reader, sz int, v *int64) (int, error) {
|
|||||||
return peekRead(r, sz, 8, func(b []byte) { *v = makeInt64(b) })
|
return peekRead(r, sz, 8, func(b []byte) { *v = makeInt64(b) })
|
||||||
}
|
}
|
||||||
|
|
||||||
func readVarInt(r *bufio.Reader, sz int, v *int64) (remain int, err error) {
|
|
||||||
// Optimistically assume that most of the time, there will be data buffered
|
|
||||||
// in the reader. If this is not the case, the buffer will be refilled after
|
|
||||||
// consuming zero bytes from the input.
|
|
||||||
input, _ := r.Peek(r.Buffered())
|
|
||||||
x := uint64(0)
|
|
||||||
s := uint(0)
|
|
||||||
|
|
||||||
for {
|
|
||||||
if len(input) > sz {
|
|
||||||
input = input[:sz]
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, b := range input {
|
|
||||||
if b < 0x80 {
|
|
||||||
x |= uint64(b) << s
|
|
||||||
*v = int64(x>>1) ^ -(int64(x) & 1)
|
|
||||||
n, err := r.Discard(i + 1)
|
|
||||||
return sz - n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
x |= uint64(b&0x7f) << s
|
|
||||||
s += 7
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make room in the input buffer to load more data from the underlying
|
|
||||||
// stream. The x and s variables are left untouched, ensuring that the
|
|
||||||
// varint decoding can continue on the next loop iteration.
|
|
||||||
n, _ := r.Discard(len(input))
|
|
||||||
sz -= n
|
|
||||||
if sz == 0 {
|
|
||||||
return 0, errShortRead
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fill the buffer: ask for one more byte, but in practice the reader
|
|
||||||
// will load way more from the underlying stream.
|
|
||||||
if _, err := r.Peek(1); err != nil {
|
|
||||||
if err == io.EOF {
|
|
||||||
err = errShortRead
|
|
||||||
}
|
|
||||||
return sz, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Grab as many bytes as possible from the buffer, then go on to the
|
|
||||||
// next loop iteration which is going to consume it.
|
|
||||||
input, _ = r.Peek(r.Buffered())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func readBool(r *bufio.Reader, sz int, v *bool) (int, error) {
|
|
||||||
return peekRead(r, sz, 1, func(b []byte) { *v = b[0] != 0 })
|
|
||||||
}
|
|
||||||
|
|
||||||
func readString(r *bufio.Reader, sz int, v *string) (int, error) {
|
func readString(r *bufio.Reader, sz int, v *string) (int, error) {
|
||||||
return readStringWith(r, sz, func(r *bufio.Reader, sz int, n int) (remain int, err error) {
|
return readStringWith(r, sz, func(r *bufio.Reader, sz int, n int) (remain int, err error) {
|
||||||
*v, remain, err = readNewString(r, sz, n)
|
*v, remain, err = readNewString(r, sz, n)
|
||||||
@@ -179,102 +125,6 @@ func readArrayLen(r *bufio.Reader, sz int, n *int) (int, error) {
|
|||||||
return sz, nil
|
return sz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func readArrayWith(r *bufio.Reader, sz int, cb func(*bufio.Reader, int) (int, error)) (int, error) {
|
|
||||||
var err error
|
|
||||||
var len int32
|
|
||||||
|
|
||||||
if sz, err = readInt32(r, sz, &len); err != nil {
|
|
||||||
return sz, err
|
|
||||||
}
|
|
||||||
|
|
||||||
for n := int(len); n > 0; n-- {
|
|
||||||
if sz, err = cb(r, sz); err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return sz, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func readStringArray(r *bufio.Reader, sz int, v *[]string) (remain int, err error) {
|
|
||||||
var content []string
|
|
||||||
fn := func(r *bufio.Reader, size int) (fnRemain int, fnErr error) {
|
|
||||||
var value string
|
|
||||||
if fnRemain, fnErr = readString(r, size, &value); fnErr != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
content = append(content, value)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if remain, err = readArrayWith(r, sz, fn); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
*v = content
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func readMapStringInt32(r *bufio.Reader, sz int, v *map[string][]int32) (remain int, err error) {
|
|
||||||
var len int32
|
|
||||||
if remain, err = readInt32(r, sz, &len); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
content := make(map[string][]int32, len)
|
|
||||||
for i := 0; i < int(len); i++ {
|
|
||||||
var key string
|
|
||||||
var values []int32
|
|
||||||
|
|
||||||
if remain, err = readString(r, remain, &key); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
fn := func(r *bufio.Reader, size int) (fnRemain int, fnErr error) {
|
|
||||||
var value int32
|
|
||||||
if fnRemain, fnErr = readInt32(r, size, &value); fnErr != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
values = append(values, value)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if remain, err = readArrayWith(r, remain, fn); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
content[key] = values
|
|
||||||
}
|
|
||||||
*v = content
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func read(r *bufio.Reader, sz int, a interface{}) (int, error) {
|
|
||||||
switch v := a.(type) {
|
|
||||||
case *int8:
|
|
||||||
return readInt8(r, sz, v)
|
|
||||||
case *int16:
|
|
||||||
return readInt16(r, sz, v)
|
|
||||||
case *int32:
|
|
||||||
return readInt32(r, sz, v)
|
|
||||||
case *int64:
|
|
||||||
return readInt64(r, sz, v)
|
|
||||||
case *bool:
|
|
||||||
return readBool(r, sz, v)
|
|
||||||
case *string:
|
|
||||||
return readString(r, sz, v)
|
|
||||||
case *[]byte:
|
|
||||||
return readBytes(r, sz, v)
|
|
||||||
}
|
|
||||||
switch v := reflect.ValueOf(a).Elem(); v.Kind() {
|
|
||||||
case reflect.Struct:
|
|
||||||
return readStruct(r, sz, v)
|
|
||||||
case reflect.Slice:
|
|
||||||
return readSlice(r, sz, v)
|
|
||||||
default:
|
|
||||||
panic(fmt.Sprintf("unsupported type: %T", a))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ReadAll(r *bufio.Reader, sz int, ptrs ...interface{}) (int, error) {
|
func ReadAll(r *bufio.Reader, sz int, ptrs ...interface{}) (int, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
@@ -307,333 +157,3 @@ func readPtr(r *bufio.Reader, sz int, ptr interface{}) (int, error) {
|
|||||||
panic(fmt.Sprintf("unsupported type: %T", v))
|
panic(fmt.Sprintf("unsupported type: %T", v))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func readStruct(r *bufio.Reader, sz int, v reflect.Value) (int, error) {
|
|
||||||
var err error
|
|
||||||
for i, n := 0, v.NumField(); i != n; i++ {
|
|
||||||
if sz, err = read(r, sz, v.Field(i).Addr().Interface()); err != nil {
|
|
||||||
return sz, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sz, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func readSlice(r *bufio.Reader, sz int, v reflect.Value) (int, error) {
|
|
||||||
var err error
|
|
||||||
var len int32
|
|
||||||
|
|
||||||
if sz, err = readInt32(r, sz, &len); err != nil {
|
|
||||||
return sz, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if n := int(len); n < 0 {
|
|
||||||
v.Set(reflect.Zero(v.Type()))
|
|
||||||
} else {
|
|
||||||
v.Set(reflect.MakeSlice(v.Type(), n, n))
|
|
||||||
|
|
||||||
for i := 0; i != n; i++ {
|
|
||||||
if sz, err = read(r, sz, v.Index(i).Addr().Interface()); err != nil {
|
|
||||||
return sz, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return sz, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func readFetchResponseHeaderV2(r *bufio.Reader, size int) (throttle int32, watermark int64, remain int, err error) {
|
|
||||||
var n int32
|
|
||||||
var p struct {
|
|
||||||
Partition int32
|
|
||||||
ErrorCode int16
|
|
||||||
HighwaterMarkOffset int64
|
|
||||||
MessageSetSize int32
|
|
||||||
}
|
|
||||||
|
|
||||||
if remain, err = readInt32(r, size, &throttle); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if remain, err = readInt32(r, remain, &n); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// This error should never trigger, unless there's a bug in the kafka client
|
|
||||||
// or server.
|
|
||||||
if n != 1 {
|
|
||||||
err = fmt.Errorf("1 kafka topic was expected in the fetch response but the client received %d", n)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// We ignore the topic name because we've requests messages for a single
|
|
||||||
// topic, unless there's a bug in the kafka server we will have received
|
|
||||||
// the name of the topic that we requested.
|
|
||||||
if remain, err = discardString(r, remain); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if remain, err = readInt32(r, remain, &n); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// This error should never trigger, unless there's a bug in the kafka client
|
|
||||||
// or server.
|
|
||||||
if n != 1 {
|
|
||||||
err = fmt.Errorf("1 kafka partition was expected in the fetch response but the client received %d", n)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if remain, err = read(r, remain, &p); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if p.ErrorCode != 0 {
|
|
||||||
err = Error(p.ErrorCode)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// This error should never trigger, unless there's a bug in the kafka client
|
|
||||||
// or server.
|
|
||||||
if remain != int(p.MessageSetSize) {
|
|
||||||
err = fmt.Errorf("the size of the message set in a fetch response doesn't match the number of remaining bytes (message set size = %d, remaining bytes = %d)", p.MessageSetSize, remain)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
watermark = p.HighwaterMarkOffset
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func readFetchResponseHeaderV5(r *bufio.Reader, size int) (throttle int32, watermark int64, remain int, err error) {
|
|
||||||
var n int32
|
|
||||||
type AbortedTransaction struct {
|
|
||||||
ProducerId int64
|
|
||||||
FirstOffset int64
|
|
||||||
}
|
|
||||||
var p struct {
|
|
||||||
Partition int32
|
|
||||||
ErrorCode int16
|
|
||||||
HighwaterMarkOffset int64
|
|
||||||
LastStableOffset int64
|
|
||||||
LogStartOffset int64
|
|
||||||
}
|
|
||||||
var messageSetSize int32
|
|
||||||
var abortedTransactions []AbortedTransaction
|
|
||||||
|
|
||||||
if remain, err = readInt32(r, size, &throttle); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if remain, err = readInt32(r, remain, &n); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// This error should never trigger, unless there's a bug in the kafka client
|
|
||||||
// or server.
|
|
||||||
if n != 1 {
|
|
||||||
err = fmt.Errorf("1 kafka topic was expected in the fetch response but the client received %d", n)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// We ignore the topic name because we've requests messages for a single
|
|
||||||
// topic, unless there's a bug in the kafka server we will have received
|
|
||||||
// the name of the topic that we requested.
|
|
||||||
if remain, err = discardString(r, remain); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if remain, err = readInt32(r, remain, &n); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// This error should never trigger, unless there's a bug in the kafka client
|
|
||||||
// or server.
|
|
||||||
if n != 1 {
|
|
||||||
err = fmt.Errorf("1 kafka partition was expected in the fetch response but the client received %d", n)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if remain, err = read(r, remain, &p); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var abortedTransactionLen int
|
|
||||||
if remain, err = readArrayLen(r, remain, &abortedTransactionLen); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if abortedTransactionLen == -1 {
|
|
||||||
abortedTransactions = nil
|
|
||||||
} else {
|
|
||||||
abortedTransactions = make([]AbortedTransaction, abortedTransactionLen)
|
|
||||||
for i := 0; i < abortedTransactionLen; i++ {
|
|
||||||
if remain, err = read(r, remain, &abortedTransactions[i]); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if p.ErrorCode != 0 {
|
|
||||||
err = Error(p.ErrorCode)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
remain, err = readInt32(r, remain, &messageSetSize)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// This error should never trigger, unless there's a bug in the kafka client
|
|
||||||
// or server.
|
|
||||||
if remain != int(messageSetSize) {
|
|
||||||
err = fmt.Errorf("the size of the message set in a fetch response doesn't match the number of remaining bytes (message set size = %d, remaining bytes = %d)", messageSetSize, remain)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
watermark = p.HighwaterMarkOffset
|
|
||||||
return
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func readFetchResponseHeaderV10(r *bufio.Reader, size int) (throttle int32, watermark int64, remain int, err error) {
|
|
||||||
var n int32
|
|
||||||
var errorCode int16
|
|
||||||
type AbortedTransaction struct {
|
|
||||||
ProducerId int64
|
|
||||||
FirstOffset int64
|
|
||||||
}
|
|
||||||
var p struct {
|
|
||||||
Partition int32
|
|
||||||
ErrorCode int16
|
|
||||||
HighwaterMarkOffset int64
|
|
||||||
LastStableOffset int64
|
|
||||||
LogStartOffset int64
|
|
||||||
}
|
|
||||||
var messageSetSize int32
|
|
||||||
var abortedTransactions []AbortedTransaction
|
|
||||||
|
|
||||||
if remain, err = readInt32(r, size, &throttle); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if remain, err = readInt16(r, remain, &errorCode); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if errorCode != 0 {
|
|
||||||
err = Error(errorCode)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if remain, err = discardInt32(r, remain); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if remain, err = readInt32(r, remain, &n); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// This error should never trigger, unless there's a bug in the kafka client
|
|
||||||
// or server.
|
|
||||||
if n != 1 {
|
|
||||||
err = fmt.Errorf("1 kafka topic was expected in the fetch response but the client received %d", n)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// We ignore the topic name because we've requests messages for a single
|
|
||||||
// topic, unless there's a bug in the kafka server we will have received
|
|
||||||
// the name of the topic that we requested.
|
|
||||||
if remain, err = discardString(r, remain); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if remain, err = readInt32(r, remain, &n); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// This error should never trigger, unless there's a bug in the kafka client
|
|
||||||
// or server.
|
|
||||||
if n != 1 {
|
|
||||||
err = fmt.Errorf("1 kafka partition was expected in the fetch response but the client received %d", n)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if remain, err = read(r, remain, &p); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var abortedTransactionLen int
|
|
||||||
if remain, err = readArrayLen(r, remain, &abortedTransactionLen); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if abortedTransactionLen == -1 {
|
|
||||||
abortedTransactions = nil
|
|
||||||
} else {
|
|
||||||
abortedTransactions = make([]AbortedTransaction, abortedTransactionLen)
|
|
||||||
for i := 0; i < abortedTransactionLen; i++ {
|
|
||||||
if remain, err = read(r, remain, &abortedTransactions[i]); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if p.ErrorCode != 0 {
|
|
||||||
err = Error(p.ErrorCode)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
remain, err = readInt32(r, remain, &messageSetSize)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// This error should never trigger, unless there's a bug in the kafka client
|
|
||||||
// or server.
|
|
||||||
if remain != int(messageSetSize) {
|
|
||||||
err = fmt.Errorf("the size of the message set in a fetch response doesn't match the number of remaining bytes (message set size = %d, remaining bytes = %d)", messageSetSize, remain)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
watermark = p.HighwaterMarkOffset
|
|
||||||
return
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func readMessageHeader(r *bufio.Reader, sz int) (offset int64, attributes int8, timestamp int64, remain int, err error) {
|
|
||||||
var version int8
|
|
||||||
|
|
||||||
if remain, err = readInt64(r, sz, &offset); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// On discarding the message size and CRC:
|
|
||||||
// ---------------------------------------
|
|
||||||
//
|
|
||||||
// - Not sure why kafka gives the message size here, we already have the
|
|
||||||
// number of remaining bytes in the response and kafka should only truncate
|
|
||||||
// the trailing message.
|
|
||||||
//
|
|
||||||
// - TCP is already taking care of ensuring data integrity, no need to
|
|
||||||
// waste resources doing it a second time so we just skip the message CRC.
|
|
||||||
//
|
|
||||||
if remain, err = discardN(r, remain, 8); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if remain, err = readInt8(r, remain, &version); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if remain, err = readInt8(r, remain, &attributes); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
switch version {
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
remain, err = readInt64(r, remain, ×tamp)
|
|
||||||
default:
|
|
||||||
err = fmt.Errorf("unsupported message version %d found in fetch response", version)
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
@@ -110,25 +110,6 @@ type RecordSet struct {
|
|||||||
Records RecordReader
|
Records RecordReader
|
||||||
}
|
}
|
||||||
|
|
||||||
// bufferedReader is an interface implemented by types like bufio.Reader, which
|
|
||||||
// we use to optimize prefix reads by accessing the internal buffer directly
|
|
||||||
// through calls to Peek.
|
|
||||||
type bufferedReader interface {
|
|
||||||
Discard(int) (int, error)
|
|
||||||
Peek(int) ([]byte, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
// bytesBuffer is an interface implemented by types like bytes.Buffer, which we
|
|
||||||
// use to optimize prefix reads by accessing the internal buffer directly
|
|
||||||
// through calls to Bytes.
|
|
||||||
type bytesBuffer interface {
|
|
||||||
Bytes() []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// magicByteOffset is the position of the magic byte in all versions of record
|
|
||||||
// sets in the kafka protocol.
|
|
||||||
const magicByteOffset = 16
|
|
||||||
|
|
||||||
// ReadFrom reads the representation of a record set from r into rs, returning
|
// ReadFrom reads the representation of a record set from r into rs, returning
|
||||||
// the number of bytes consumed from r, and an non-nil error if the record set
|
// the number of bytes consumed from r, and an non-nil error if the record set
|
||||||
// could not be read.
|
// could not be read.
|
||||||
@@ -292,23 +273,7 @@ func (rs *RecordSet) WriteTo(w io.Writer) (int64, error) {
|
|||||||
return 0, nil
|
return 0, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeTime(t int64) time.Time {
|
|
||||||
return time.Unix(t/1000, (t%1000)*int64(time.Millisecond))
|
|
||||||
}
|
|
||||||
|
|
||||||
func timestamp(t time.Time) int64 {
|
|
||||||
if t.IsZero() {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return t.UnixNano() / int64(time.Millisecond)
|
|
||||||
}
|
|
||||||
|
|
||||||
func packUint32(u uint32) (b [4]byte) {
|
func packUint32(u uint32) (b [4]byte) {
|
||||||
binary.BigEndian.PutUint32(b[:], u)
|
binary.BigEndian.PutUint32(b[:], u)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func packUint64(u uint64) (b [8]byte) {
|
|
||||||
binary.BigEndian.PutUint64(b[:], u)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
@@ -34,10 +34,6 @@ func valueOf(x interface{}) value {
|
|||||||
return value{val: reflect.ValueOf(x).Elem()}
|
return value{val: reflect.ValueOf(x).Elem()}
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeValue(t reflect.Type) value {
|
|
||||||
return value{val: reflect.New(t).Elem()}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v value) bool() bool { return v.val.Bool() }
|
func (v value) bool() bool { return v.val.Bool() }
|
||||||
|
|
||||||
func (v value) int8() int8 { return int8(v.int64()) }
|
func (v value) int8() int8 { return int8(v.int64()) }
|
||||||
@@ -54,7 +50,7 @@ func (v value) bytes() []byte { return v.val.Bytes() }
|
|||||||
|
|
||||||
func (v value) iface(t reflect.Type) interface{} { return v.val.Addr().Interface() }
|
func (v value) iface(t reflect.Type) interface{} { return v.val.Addr().Interface() }
|
||||||
|
|
||||||
func (v value) array(t reflect.Type) array { return array{val: v.val} }
|
func (v value) array(t reflect.Type) array { return array{val: v.val} } //nolint
|
||||||
|
|
||||||
func (v value) setBool(b bool) { v.val.SetBool(b) }
|
func (v value) setBool(b bool) { v.val.SetBool(b) }
|
||||||
|
|
||||||
|
@@ -64,19 +64,19 @@ func ReadRequest(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer) (api
|
|||||||
case Metadata:
|
case Metadata:
|
||||||
var mt interface{}
|
var mt interface{}
|
||||||
var metadataRequest interface{}
|
var metadataRequest interface{}
|
||||||
if apiVersion >= 11 {
|
if apiVersion >= v11 {
|
||||||
types := makeTypes(reflect.TypeOf(&MetadataRequestV11{}).Elem())
|
types := makeTypes(reflect.TypeOf(&MetadataRequestV11{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
metadataRequest = &MetadataRequestV11{}
|
metadataRequest = &MetadataRequestV11{}
|
||||||
} else if apiVersion >= 10 {
|
} else if apiVersion >= v10 {
|
||||||
types := makeTypes(reflect.TypeOf(&MetadataRequestV10{}).Elem())
|
types := makeTypes(reflect.TypeOf(&MetadataRequestV10{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
metadataRequest = &MetadataRequestV10{}
|
metadataRequest = &MetadataRequestV10{}
|
||||||
} else if apiVersion >= 8 {
|
} else if apiVersion >= v8 {
|
||||||
types := makeTypes(reflect.TypeOf(&MetadataRequestV8{}).Elem())
|
types := makeTypes(reflect.TypeOf(&MetadataRequestV8{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
metadataRequest = &MetadataRequestV8{}
|
metadataRequest = &MetadataRequestV8{}
|
||||||
} else if apiVersion >= 4 {
|
} else if apiVersion >= v4 {
|
||||||
types := makeTypes(reflect.TypeOf(&MetadataRequestV4{}).Elem())
|
types := makeTypes(reflect.TypeOf(&MetadataRequestV4{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
metadataRequest = &MetadataRequestV4{}
|
metadataRequest = &MetadataRequestV4{}
|
||||||
@@ -87,11 +87,10 @@ func ReadRequest(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer) (api
|
|||||||
}
|
}
|
||||||
mt.(messageType).decode(d, valueOf(metadataRequest))
|
mt.(messageType).decode(d, valueOf(metadataRequest))
|
||||||
payload = metadataRequest
|
payload = metadataRequest
|
||||||
break
|
|
||||||
case ApiVersions:
|
case ApiVersions:
|
||||||
var mt interface{}
|
var mt interface{}
|
||||||
var apiVersionsRequest interface{}
|
var apiVersionsRequest interface{}
|
||||||
if apiVersion >= 3 {
|
if apiVersion >= v3 {
|
||||||
types := makeTypes(reflect.TypeOf(&ApiVersionsRequestV3{}).Elem())
|
types := makeTypes(reflect.TypeOf(&ApiVersionsRequestV3{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
apiVersionsRequest = &ApiVersionsRequestV3{}
|
apiVersionsRequest = &ApiVersionsRequestV3{}
|
||||||
@@ -102,11 +101,10 @@ func ReadRequest(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer) (api
|
|||||||
}
|
}
|
||||||
mt.(messageType).decode(d, valueOf(apiVersionsRequest))
|
mt.(messageType).decode(d, valueOf(apiVersionsRequest))
|
||||||
payload = apiVersionsRequest
|
payload = apiVersionsRequest
|
||||||
break
|
|
||||||
case Produce:
|
case Produce:
|
||||||
var mt interface{}
|
var mt interface{}
|
||||||
var produceRequest interface{}
|
var produceRequest interface{}
|
||||||
if apiVersion >= 3 {
|
if apiVersion >= v3 {
|
||||||
types := makeTypes(reflect.TypeOf(&ProduceRequestV3{}).Elem())
|
types := makeTypes(reflect.TypeOf(&ProduceRequestV3{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
produceRequest = &ProduceRequestV3{}
|
produceRequest = &ProduceRequestV3{}
|
||||||
@@ -117,7 +115,6 @@ func ReadRequest(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer) (api
|
|||||||
}
|
}
|
||||||
mt.(messageType).decode(d, valueOf(produceRequest))
|
mt.(messageType).decode(d, valueOf(produceRequest))
|
||||||
payload = produceRequest
|
payload = produceRequest
|
||||||
break
|
|
||||||
case Fetch:
|
case Fetch:
|
||||||
var mt interface{}
|
var mt interface{}
|
||||||
var fetchRequest interface{}
|
var fetchRequest interface{}
|
||||||
@@ -125,23 +122,23 @@ func ReadRequest(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer) (api
|
|||||||
types := makeTypes(reflect.TypeOf(&FetchRequestV11{}).Elem())
|
types := makeTypes(reflect.TypeOf(&FetchRequestV11{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
fetchRequest = &FetchRequestV11{}
|
fetchRequest = &FetchRequestV11{}
|
||||||
} else if apiVersion >= 9 {
|
} else if apiVersion >= v9 {
|
||||||
types := makeTypes(reflect.TypeOf(&FetchRequestV9{}).Elem())
|
types := makeTypes(reflect.TypeOf(&FetchRequestV9{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
fetchRequest = &FetchRequestV9{}
|
fetchRequest = &FetchRequestV9{}
|
||||||
} else if apiVersion >= 7 {
|
} else if apiVersion >= v7 {
|
||||||
types := makeTypes(reflect.TypeOf(&FetchRequestV7{}).Elem())
|
types := makeTypes(reflect.TypeOf(&FetchRequestV7{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
fetchRequest = &FetchRequestV7{}
|
fetchRequest = &FetchRequestV7{}
|
||||||
} else if apiVersion >= 5 {
|
} else if apiVersion >= v5 {
|
||||||
types := makeTypes(reflect.TypeOf(&FetchRequestV5{}).Elem())
|
types := makeTypes(reflect.TypeOf(&FetchRequestV5{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
fetchRequest = &FetchRequestV5{}
|
fetchRequest = &FetchRequestV5{}
|
||||||
} else if apiVersion >= 4 {
|
} else if apiVersion >= v4 {
|
||||||
types := makeTypes(reflect.TypeOf(&FetchRequestV4{}).Elem())
|
types := makeTypes(reflect.TypeOf(&FetchRequestV4{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
fetchRequest = &FetchRequestV4{}
|
fetchRequest = &FetchRequestV4{}
|
||||||
} else if apiVersion >= 3 {
|
} else if apiVersion >= v3 {
|
||||||
types := makeTypes(reflect.TypeOf(&FetchRequestV3{}).Elem())
|
types := makeTypes(reflect.TypeOf(&FetchRequestV3{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
fetchRequest = &FetchRequestV3{}
|
fetchRequest = &FetchRequestV3{}
|
||||||
@@ -152,19 +149,18 @@ func ReadRequest(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer) (api
|
|||||||
}
|
}
|
||||||
mt.(messageType).decode(d, valueOf(fetchRequest))
|
mt.(messageType).decode(d, valueOf(fetchRequest))
|
||||||
payload = fetchRequest
|
payload = fetchRequest
|
||||||
break
|
|
||||||
case ListOffsets:
|
case ListOffsets:
|
||||||
var mt interface{}
|
var mt interface{}
|
||||||
var listOffsetsRequest interface{}
|
var listOffsetsRequest interface{}
|
||||||
if apiVersion >= 4 {
|
if apiVersion >= v4 {
|
||||||
types := makeTypes(reflect.TypeOf(&ListOffsetsRequestV4{}).Elem())
|
types := makeTypes(reflect.TypeOf(&ListOffsetsRequestV4{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
listOffsetsRequest = &ListOffsetsRequestV4{}
|
listOffsetsRequest = &ListOffsetsRequestV4{}
|
||||||
} else if apiVersion >= 2 {
|
} else if apiVersion >= v2 {
|
||||||
types := makeTypes(reflect.TypeOf(&ListOffsetsRequestV2{}).Elem())
|
types := makeTypes(reflect.TypeOf(&ListOffsetsRequestV2{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
listOffsetsRequest = &ListOffsetsRequestV2{}
|
listOffsetsRequest = &ListOffsetsRequestV2{}
|
||||||
} else if apiVersion >= 1 {
|
} else if apiVersion >= v1 {
|
||||||
types := makeTypes(reflect.TypeOf(&ListOffsetsRequestV1{}).Elem())
|
types := makeTypes(reflect.TypeOf(&ListOffsetsRequestV1{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
listOffsetsRequest = &ListOffsetsRequestV1{}
|
listOffsetsRequest = &ListOffsetsRequestV1{}
|
||||||
@@ -175,11 +171,10 @@ func ReadRequest(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer) (api
|
|||||||
}
|
}
|
||||||
mt.(messageType).decode(d, valueOf(listOffsetsRequest))
|
mt.(messageType).decode(d, valueOf(listOffsetsRequest))
|
||||||
payload = listOffsetsRequest
|
payload = listOffsetsRequest
|
||||||
break
|
|
||||||
case CreateTopics:
|
case CreateTopics:
|
||||||
var mt interface{}
|
var mt interface{}
|
||||||
var createTopicsRequest interface{}
|
var createTopicsRequest interface{}
|
||||||
if apiVersion >= 1 {
|
if apiVersion >= v1 {
|
||||||
types := makeTypes(reflect.TypeOf(&CreateTopicsRequestV1{}).Elem())
|
types := makeTypes(reflect.TypeOf(&CreateTopicsRequestV1{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
createTopicsRequest = &CreateTopicsRequestV1{}
|
createTopicsRequest = &CreateTopicsRequestV1{}
|
||||||
@@ -190,11 +185,10 @@ func ReadRequest(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer) (api
|
|||||||
}
|
}
|
||||||
mt.(messageType).decode(d, valueOf(createTopicsRequest))
|
mt.(messageType).decode(d, valueOf(createTopicsRequest))
|
||||||
payload = createTopicsRequest
|
payload = createTopicsRequest
|
||||||
break
|
|
||||||
case DeleteTopics:
|
case DeleteTopics:
|
||||||
var mt interface{}
|
var mt interface{}
|
||||||
var deleteTopicsRequest interface{}
|
var deleteTopicsRequest interface{}
|
||||||
if apiVersion >= 6 {
|
if apiVersion >= v6 {
|
||||||
types := makeTypes(reflect.TypeOf(&DeleteTopicsRequestV6{}).Elem())
|
types := makeTypes(reflect.TypeOf(&DeleteTopicsRequestV6{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
deleteTopicsRequest = &DeleteTopicsRequestV6{}
|
deleteTopicsRequest = &DeleteTopicsRequestV6{}
|
||||||
@@ -285,7 +279,7 @@ func WriteRequest(w io.Writer, apiVersion int16, correlationID int32, clientID s
|
|||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
size := packUint32(uint32(b.Size()) - 4)
|
size := packUint32(uint32(b.Size()) - 4)
|
||||||
b.WriteAt(size[:], 0)
|
_, _ = b.WriteAt(size[:], 0)
|
||||||
_, err = b.WriteTo(w)
|
_, err = b.WriteTo(w)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -62,35 +62,35 @@ func ReadResponse(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer, emi
|
|||||||
case Metadata:
|
case Metadata:
|
||||||
var mt interface{}
|
var mt interface{}
|
||||||
var metadataResponse interface{}
|
var metadataResponse interface{}
|
||||||
if apiVersion >= 11 {
|
if apiVersion >= v11 {
|
||||||
types := makeTypes(reflect.TypeOf(&MetadataResponseV11{}).Elem())
|
types := makeTypes(reflect.TypeOf(&MetadataResponseV11{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
metadataResponse = &MetadataResponseV11{}
|
metadataResponse = &MetadataResponseV11{}
|
||||||
} else if apiVersion >= 10 {
|
} else if apiVersion >= v10 {
|
||||||
types := makeTypes(reflect.TypeOf(&MetadataResponseV10{}).Elem())
|
types := makeTypes(reflect.TypeOf(&MetadataResponseV10{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
metadataResponse = &MetadataResponseV10{}
|
metadataResponse = &MetadataResponseV10{}
|
||||||
} else if apiVersion >= 8 {
|
} else if apiVersion >= v8 {
|
||||||
types := makeTypes(reflect.TypeOf(&MetadataResponseV8{}).Elem())
|
types := makeTypes(reflect.TypeOf(&MetadataResponseV8{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
metadataResponse = &MetadataResponseV8{}
|
metadataResponse = &MetadataResponseV8{}
|
||||||
} else if apiVersion >= 7 {
|
} else if apiVersion >= v7 {
|
||||||
types := makeTypes(reflect.TypeOf(&MetadataResponseV7{}).Elem())
|
types := makeTypes(reflect.TypeOf(&MetadataResponseV7{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
metadataResponse = &MetadataResponseV7{}
|
metadataResponse = &MetadataResponseV7{}
|
||||||
} else if apiVersion >= 5 {
|
} else if apiVersion >= v5 {
|
||||||
types := makeTypes(reflect.TypeOf(&MetadataResponseV5{}).Elem())
|
types := makeTypes(reflect.TypeOf(&MetadataResponseV5{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
metadataResponse = &MetadataResponseV5{}
|
metadataResponse = &MetadataResponseV5{}
|
||||||
} else if apiVersion >= 3 {
|
} else if apiVersion >= v3 {
|
||||||
types := makeTypes(reflect.TypeOf(&MetadataResponseV3{}).Elem())
|
types := makeTypes(reflect.TypeOf(&MetadataResponseV3{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
metadataResponse = &MetadataResponseV3{}
|
metadataResponse = &MetadataResponseV3{}
|
||||||
} else if apiVersion >= 2 {
|
} else if apiVersion >= v2 {
|
||||||
types := makeTypes(reflect.TypeOf(&MetadataResponseV2{}).Elem())
|
types := makeTypes(reflect.TypeOf(&MetadataResponseV2{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
metadataResponse = &MetadataResponseV2{}
|
metadataResponse = &MetadataResponseV2{}
|
||||||
} else if apiVersion >= 1 {
|
} else if apiVersion >= v1 {
|
||||||
types := makeTypes(reflect.TypeOf(&MetadataResponseV1{}).Elem())
|
types := makeTypes(reflect.TypeOf(&MetadataResponseV1{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
metadataResponse = &MetadataResponseV1{}
|
metadataResponse = &MetadataResponseV1{}
|
||||||
@@ -101,11 +101,10 @@ func ReadResponse(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer, emi
|
|||||||
}
|
}
|
||||||
mt.(messageType).decode(d, valueOf(metadataResponse))
|
mt.(messageType).decode(d, valueOf(metadataResponse))
|
||||||
reqResPair.Response.Payload = metadataResponse
|
reqResPair.Response.Payload = metadataResponse
|
||||||
break
|
|
||||||
case ApiVersions:
|
case ApiVersions:
|
||||||
var mt interface{}
|
var mt interface{}
|
||||||
var apiVersionsResponse interface{}
|
var apiVersionsResponse interface{}
|
||||||
if apiVersion >= 1 {
|
if apiVersion >= v1 {
|
||||||
types := makeTypes(reflect.TypeOf(&ApiVersionsResponseV1{}).Elem())
|
types := makeTypes(reflect.TypeOf(&ApiVersionsResponseV1{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
apiVersionsResponse = &ApiVersionsResponseV1{}
|
apiVersionsResponse = &ApiVersionsResponseV1{}
|
||||||
@@ -116,23 +115,22 @@ func ReadResponse(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer, emi
|
|||||||
}
|
}
|
||||||
mt.(messageType).decode(d, valueOf(apiVersionsResponse))
|
mt.(messageType).decode(d, valueOf(apiVersionsResponse))
|
||||||
reqResPair.Response.Payload = apiVersionsResponse
|
reqResPair.Response.Payload = apiVersionsResponse
|
||||||
break
|
|
||||||
case Produce:
|
case Produce:
|
||||||
var mt interface{}
|
var mt interface{}
|
||||||
var produceResponse interface{}
|
var produceResponse interface{}
|
||||||
if apiVersion >= 8 {
|
if apiVersion >= v8 {
|
||||||
types := makeTypes(reflect.TypeOf(&ProduceResponseV8{}).Elem())
|
types := makeTypes(reflect.TypeOf(&ProduceResponseV8{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
produceResponse = &ProduceResponseV8{}
|
produceResponse = &ProduceResponseV8{}
|
||||||
} else if apiVersion >= 5 {
|
} else if apiVersion >= v5 {
|
||||||
types := makeTypes(reflect.TypeOf(&ProduceResponseV5{}).Elem())
|
types := makeTypes(reflect.TypeOf(&ProduceResponseV5{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
produceResponse = &ProduceResponseV5{}
|
produceResponse = &ProduceResponseV5{}
|
||||||
} else if apiVersion >= 2 {
|
} else if apiVersion >= v2 {
|
||||||
types := makeTypes(reflect.TypeOf(&ProduceResponseV2{}).Elem())
|
types := makeTypes(reflect.TypeOf(&ProduceResponseV2{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
produceResponse = &ProduceResponseV2{}
|
produceResponse = &ProduceResponseV2{}
|
||||||
} else if apiVersion >= 1 {
|
} else if apiVersion >= v1 {
|
||||||
types := makeTypes(reflect.TypeOf(&ProduceResponseV1{}).Elem())
|
types := makeTypes(reflect.TypeOf(&ProduceResponseV1{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
produceResponse = &ProduceResponseV1{}
|
produceResponse = &ProduceResponseV1{}
|
||||||
@@ -143,27 +141,26 @@ func ReadResponse(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer, emi
|
|||||||
}
|
}
|
||||||
mt.(messageType).decode(d, valueOf(produceResponse))
|
mt.(messageType).decode(d, valueOf(produceResponse))
|
||||||
reqResPair.Response.Payload = produceResponse
|
reqResPair.Response.Payload = produceResponse
|
||||||
break
|
|
||||||
case Fetch:
|
case Fetch:
|
||||||
var mt interface{}
|
var mt interface{}
|
||||||
var fetchResponse interface{}
|
var fetchResponse interface{}
|
||||||
if apiVersion >= 11 {
|
if apiVersion >= v11 {
|
||||||
types := makeTypes(reflect.TypeOf(&FetchResponseV11{}).Elem())
|
types := makeTypes(reflect.TypeOf(&FetchResponseV11{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
fetchResponse = &FetchResponseV11{}
|
fetchResponse = &FetchResponseV11{}
|
||||||
} else if apiVersion >= 7 {
|
} else if apiVersion >= v7 {
|
||||||
types := makeTypes(reflect.TypeOf(&FetchResponseV7{}).Elem())
|
types := makeTypes(reflect.TypeOf(&FetchResponseV7{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
fetchResponse = &FetchResponseV7{}
|
fetchResponse = &FetchResponseV7{}
|
||||||
} else if apiVersion >= 5 {
|
} else if apiVersion >= v5 {
|
||||||
types := makeTypes(reflect.TypeOf(&FetchResponseV5{}).Elem())
|
types := makeTypes(reflect.TypeOf(&FetchResponseV5{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
fetchResponse = &FetchResponseV5{}
|
fetchResponse = &FetchResponseV5{}
|
||||||
} else if apiVersion >= 4 {
|
} else if apiVersion >= v4 {
|
||||||
types := makeTypes(reflect.TypeOf(&FetchResponseV4{}).Elem())
|
types := makeTypes(reflect.TypeOf(&FetchResponseV4{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
fetchResponse = &FetchResponseV4{}
|
fetchResponse = &FetchResponseV4{}
|
||||||
} else if apiVersion >= 1 {
|
} else if apiVersion >= v1 {
|
||||||
types := makeTypes(reflect.TypeOf(&FetchResponseV1{}).Elem())
|
types := makeTypes(reflect.TypeOf(&FetchResponseV1{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
fetchResponse = &FetchResponseV1{}
|
fetchResponse = &FetchResponseV1{}
|
||||||
@@ -174,19 +171,18 @@ func ReadResponse(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer, emi
|
|||||||
}
|
}
|
||||||
mt.(messageType).decode(d, valueOf(fetchResponse))
|
mt.(messageType).decode(d, valueOf(fetchResponse))
|
||||||
reqResPair.Response.Payload = fetchResponse
|
reqResPair.Response.Payload = fetchResponse
|
||||||
break
|
|
||||||
case ListOffsets:
|
case ListOffsets:
|
||||||
var mt interface{}
|
var mt interface{}
|
||||||
var listOffsetsResponse interface{}
|
var listOffsetsResponse interface{}
|
||||||
if apiVersion >= 4 {
|
if apiVersion >= v4 {
|
||||||
types := makeTypes(reflect.TypeOf(&ListOffsetsResponseV4{}).Elem())
|
types := makeTypes(reflect.TypeOf(&ListOffsetsResponseV4{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
listOffsetsResponse = &ListOffsetsResponseV4{}
|
listOffsetsResponse = &ListOffsetsResponseV4{}
|
||||||
} else if apiVersion >= 2 {
|
} else if apiVersion >= v2 {
|
||||||
types := makeTypes(reflect.TypeOf(&ListOffsetsResponseV2{}).Elem())
|
types := makeTypes(reflect.TypeOf(&ListOffsetsResponseV2{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
listOffsetsResponse = &ListOffsetsResponseV2{}
|
listOffsetsResponse = &ListOffsetsResponseV2{}
|
||||||
} else if apiVersion >= 1 {
|
} else if apiVersion >= v1 {
|
||||||
types := makeTypes(reflect.TypeOf(&ListOffsetsResponseV1{}).Elem())
|
types := makeTypes(reflect.TypeOf(&ListOffsetsResponseV1{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
listOffsetsResponse = &ListOffsetsResponseV1{}
|
listOffsetsResponse = &ListOffsetsResponseV1{}
|
||||||
@@ -200,19 +196,19 @@ func ReadResponse(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer, emi
|
|||||||
case CreateTopics:
|
case CreateTopics:
|
||||||
var mt interface{}
|
var mt interface{}
|
||||||
var createTopicsResponse interface{}
|
var createTopicsResponse interface{}
|
||||||
if apiVersion >= 7 {
|
if apiVersion >= v7 {
|
||||||
types := makeTypes(reflect.TypeOf(&CreateTopicsResponseV0{}).Elem())
|
types := makeTypes(reflect.TypeOf(&CreateTopicsResponseV0{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
createTopicsResponse = &CreateTopicsResponseV0{}
|
createTopicsResponse = &CreateTopicsResponseV0{}
|
||||||
} else if apiVersion >= 5 {
|
} else if apiVersion >= v5 {
|
||||||
types := makeTypes(reflect.TypeOf(&CreateTopicsResponseV5{}).Elem())
|
types := makeTypes(reflect.TypeOf(&CreateTopicsResponseV5{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
createTopicsResponse = &CreateTopicsResponseV5{}
|
createTopicsResponse = &CreateTopicsResponseV5{}
|
||||||
} else if apiVersion >= 2 {
|
} else if apiVersion >= v2 {
|
||||||
types := makeTypes(reflect.TypeOf(&CreateTopicsResponseV2{}).Elem())
|
types := makeTypes(reflect.TypeOf(&CreateTopicsResponseV2{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
createTopicsResponse = &CreateTopicsResponseV2{}
|
createTopicsResponse = &CreateTopicsResponseV2{}
|
||||||
} else if apiVersion >= 1 {
|
} else if apiVersion >= v1 {
|
||||||
types := makeTypes(reflect.TypeOf(&CreateTopicsResponseV1{}).Elem())
|
types := makeTypes(reflect.TypeOf(&CreateTopicsResponseV1{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
createTopicsResponse = &CreateTopicsResponseV1{}
|
createTopicsResponse = &CreateTopicsResponseV1{}
|
||||||
@@ -223,19 +219,18 @@ func ReadResponse(r io.Reader, tcpID *api.TcpID, superTimer *api.SuperTimer, emi
|
|||||||
}
|
}
|
||||||
mt.(messageType).decode(d, valueOf(createTopicsResponse))
|
mt.(messageType).decode(d, valueOf(createTopicsResponse))
|
||||||
reqResPair.Response.Payload = createTopicsResponse
|
reqResPair.Response.Payload = createTopicsResponse
|
||||||
break
|
|
||||||
case DeleteTopics:
|
case DeleteTopics:
|
||||||
var mt interface{}
|
var mt interface{}
|
||||||
var deleteTopicsResponse interface{}
|
var deleteTopicsResponse interface{}
|
||||||
if apiVersion >= 6 {
|
if apiVersion >= v6 {
|
||||||
types := makeTypes(reflect.TypeOf(&DeleteTopicsReponseV6{}).Elem())
|
types := makeTypes(reflect.TypeOf(&DeleteTopicsReponseV6{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
deleteTopicsResponse = &DeleteTopicsReponseV6{}
|
deleteTopicsResponse = &DeleteTopicsReponseV6{}
|
||||||
} else if apiVersion >= 5 {
|
} else if apiVersion >= v5 {
|
||||||
types := makeTypes(reflect.TypeOf(&DeleteTopicsReponseV5{}).Elem())
|
types := makeTypes(reflect.TypeOf(&DeleteTopicsReponseV5{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
deleteTopicsResponse = &DeleteTopicsReponseV5{}
|
deleteTopicsResponse = &DeleteTopicsReponseV5{}
|
||||||
} else if apiVersion >= 1 {
|
} else if apiVersion >= v1 {
|
||||||
types := makeTypes(reflect.TypeOf(&DeleteTopicsReponseV1{}).Elem())
|
types := makeTypes(reflect.TypeOf(&DeleteTopicsReponseV1{}).Elem())
|
||||||
mt = types[0]
|
mt = types[0]
|
||||||
deleteTopicsResponse = &DeleteTopicsReponseV1{}
|
deleteTopicsResponse = &DeleteTopicsReponseV1{}
|
||||||
@@ -337,7 +332,7 @@ func WriteResponse(w io.Writer, apiVersion int16, correlationID int32, msg Messa
|
|||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
size := packUint32(uint32(b.Size()) - 4)
|
size := packUint32(uint32(b.Size()) - 4)
|
||||||
b.WriteAt(size[:], 0)
|
_, _ = b.WriteAt(size[:], 0)
|
||||||
_, err = b.WriteTo(w)
|
_, err = b.WriteTo(w)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -296,8 +296,6 @@ type MessageV0 struct {
|
|||||||
Set *MessageSet `json:"set"` // the message set a message might wrap
|
Set *MessageSet `json:"set"` // the message set a message might wrap
|
||||||
Version int8 `json:"version"` // v1 requires Kafka 0.10
|
Version int8 `json:"version"` // v1 requires Kafka 0.10
|
||||||
Timestamp time.Time `json:"timestamp"` // the timestamp of the message (version 1+ only)
|
Timestamp time.Time `json:"timestamp"` // the timestamp of the message (version 1+ only)
|
||||||
|
|
||||||
compressedSize int // used for computing the compression ratio metrics
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MessageBlock represents a part of request with message
|
// MessageBlock represents a part of request with message
|
||||||
|
@@ -52,9 +52,13 @@ func (d dissecting) Dissect(b *bufio.Reader, isClient bool, tcpID *api.TcpID, co
|
|||||||
}
|
}
|
||||||
|
|
||||||
if isClient {
|
if isClient {
|
||||||
handleClientStream(tcpID, counterPair, superTimer, emitter, redisPacket)
|
err = handleClientStream(tcpID, counterPair, superTimer, emitter, redisPacket)
|
||||||
} else {
|
} else {
|
||||||
handleServerStream(tcpID, counterPair, superTimer, emitter, redisPacket)
|
err = handleServerStream(tcpID, counterPair, superTimer, emitter, redisPacket)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,7 +112,7 @@ func (d dissecting) Analyze(item *api.OutputChannelItem, resolvedSource string,
|
|||||||
|
|
||||||
func (d dissecting) Represent(request map[string]interface{}, response map[string]interface{}) (object []byte, bodySize int64, err error) {
|
func (d dissecting) Represent(request map[string]interface{}, response map[string]interface{}) (object []byte, bodySize int64, err error) {
|
||||||
bodySize = 0
|
bodySize = 0
|
||||||
representation := make(map[string]interface{}, 0)
|
representation := make(map[string]interface{})
|
||||||
repRequest := representGeneric(request, `request.`)
|
repRequest := representGeneric(request, `request.`)
|
||||||
repResponse := representGeneric(response, `response.`)
|
repResponse := representGeneric(response, `response.`)
|
||||||
representation["request"] = repRequest
|
representation["request"] = repRequest
|
||||||
|
@@ -4,11 +4,9 @@ import (
|
|||||||
"bufio"
|
"bufio"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -18,90 +16,12 @@ const (
|
|||||||
busyPrefix = "BUSY "
|
busyPrefix = "BUSY "
|
||||||
noscriptPrefix = "NOSCRIPT "
|
noscriptPrefix = "NOSCRIPT "
|
||||||
|
|
||||||
defaultHost = "localhost"
|
|
||||||
defaultPort = 6379
|
|
||||||
defaultSentinelPort = 26379
|
|
||||||
defaultTimeout = 5 * time.Second
|
|
||||||
defaultDatabase = 2 * time.Second
|
|
||||||
|
|
||||||
dollarByte = '$'
|
dollarByte = '$'
|
||||||
asteriskByte = '*'
|
asteriskByte = '*'
|
||||||
plusByte = '+'
|
plusByte = '+'
|
||||||
minusByte = '-'
|
minusByte = '-'
|
||||||
colonByte = ':'
|
colonByte = ':'
|
||||||
notApplicableByte = '0'
|
notApplicableByte = '0'
|
||||||
|
|
||||||
sentinelMasters = "masters"
|
|
||||||
sentinelGetMasterAddrByName = "get-master-addr-by-name"
|
|
||||||
sentinelReset = "reset"
|
|
||||||
sentinelSlaves = "slaves"
|
|
||||||
sentinelFailOver = "failover"
|
|
||||||
sentinelMonitor = "monitor"
|
|
||||||
sentinelRemove = "remove"
|
|
||||||
sentinelSet = "set"
|
|
||||||
|
|
||||||
clusterNodes = "nodes"
|
|
||||||
clusterMeet = "meet"
|
|
||||||
clusterReset = "reset"
|
|
||||||
clusterAddSlots = "addslots"
|
|
||||||
clusterDelSlots = "delslots"
|
|
||||||
clusterInfo = "info"
|
|
||||||
clusterGetKeysInSlot = "getkeysinslot"
|
|
||||||
clusterSetSlot = "setslot"
|
|
||||||
clusterSetSlotNode = "node"
|
|
||||||
clusterSetSlotMigrating = "migrating"
|
|
||||||
clusterSetSlotImporting = "importing"
|
|
||||||
clusterSetSlotStable = "stable"
|
|
||||||
clusterForget = "forget"
|
|
||||||
clusterFlushSlot = "flushslots"
|
|
||||||
clusterKeySlot = "keyslot"
|
|
||||||
clusterCountKeyInSlot = "countkeysinslot"
|
|
||||||
clusterSaveConfig = "saveconfig"
|
|
||||||
clusterReplicate = "replicate"
|
|
||||||
clusterSlaves = "slaves"
|
|
||||||
clusterFailOver = "failover"
|
|
||||||
clusterSlots = "slots"
|
|
||||||
pubSubChannels = "channels"
|
|
||||||
pubSubNumSub = "numsub"
|
|
||||||
pubSubNumPat = "numpat"
|
|
||||||
)
|
|
||||||
|
|
||||||
//intToByteArr convert int to byte array
|
|
||||||
func intToByteArr(a int) []byte {
|
|
||||||
buf := make([]byte, 0)
|
|
||||||
return strconv.AppendInt(buf, int64(a), 10)
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
bytesTrue = intToByteArr(1)
|
|
||||||
bytesFalse = intToByteArr(0)
|
|
||||||
bytesTilde = []byte("~")
|
|
||||||
|
|
||||||
positiveInfinityBytes = []byte("+inf")
|
|
||||||
negativeInfinityBytes = []byte("-inf")
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
sizeTable = []int{9, 99, 999, 9999, 99999, 999999, 9999999, 99999999,
|
|
||||||
999999999, math.MaxInt32}
|
|
||||||
|
|
||||||
digitTens = []byte{'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1',
|
|
||||||
'1', '1', '1', '1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2',
|
|
||||||
'2', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '4', '4', '4', '4', '4', '4', '4',
|
|
||||||
'4', '4', '4', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '6', '6', '6', '6', '6',
|
|
||||||
'6', '6', '6', '6', '6', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '8', '8', '8',
|
|
||||||
'8', '8', '8', '8', '8', '8', '8', '9', '9', '9', '9', '9', '9', '9', '9', '9', '9'}
|
|
||||||
|
|
||||||
digitOnes = []byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
|
|
||||||
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8',
|
|
||||||
'9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6',
|
|
||||||
'7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4',
|
|
||||||
'5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2',
|
|
||||||
'3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
|
|
||||||
|
|
||||||
digits = []byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a',
|
|
||||||
'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
|
|
||||||
't', 'u', 'v', 'w', 'x', 'y', 'z'}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// receive message from redis
|
// receive message from redis
|
||||||
@@ -298,9 +218,9 @@ func (p *RedisProtocol) Read() (packet *RedisPacket, err error) {
|
|||||||
packet = &RedisPacket{}
|
packet = &RedisPacket{}
|
||||||
packet.Type = r
|
packet.Type = r
|
||||||
|
|
||||||
switch x.(type) {
|
switch v := x.(type) {
|
||||||
case []interface{}:
|
case []interface{}:
|
||||||
array := x.([]interface{})
|
array := v
|
||||||
if len(array) > 0 {
|
if len(array) > 0 {
|
||||||
switch array[0].(type) {
|
switch array[0].(type) {
|
||||||
case []uint8:
|
case []uint8:
|
||||||
@@ -324,11 +244,11 @@ func (p *RedisProtocol) Read() (packet *RedisPacket, err error) {
|
|||||||
if len(array) > 3 {
|
if len(array) > 3 {
|
||||||
packet.Value = fmt.Sprintf("[%s", packet.Value)
|
packet.Value = fmt.Sprintf("[%s", packet.Value)
|
||||||
for _, item := range array[3:] {
|
for _, item := range array[3:] {
|
||||||
switch item.(type) {
|
switch j := item.(type) {
|
||||||
case []uint8:
|
case []uint8:
|
||||||
packet.Value = fmt.Sprintf("%s, %s", packet.Value, item.([]uint8))
|
packet.Value = fmt.Sprintf("%s, %s", packet.Value, j)
|
||||||
case int64:
|
case int64:
|
||||||
packet.Value = fmt.Sprintf("%s, %d", packet.Value, item.(int64))
|
packet.Value = fmt.Sprintf("%s, %d", packet.Value, j)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
packet.Value = strings.TrimSuffix(packet.Value, ", ")
|
packet.Value = strings.TrimSuffix(packet.Value, ", ")
|
||||||
@@ -341,7 +261,7 @@ func (p *RedisProtocol) Read() (packet *RedisPacket, err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case []uint8:
|
case []uint8:
|
||||||
val := string(x.([]uint8))
|
val := string(v)
|
||||||
if packet.Type == types[plusByte] {
|
if packet.Type == types[plusByte] {
|
||||||
packet.Keyword = RedisKeyword(strings.ToUpper(val))
|
packet.Keyword = RedisKeyword(strings.ToUpper(val))
|
||||||
if !isValidRedisKeyword(keywords, packet.Keyword) {
|
if !isValidRedisKeyword(keywords, packet.Keyword) {
|
||||||
@@ -352,9 +272,9 @@ func (p *RedisProtocol) Read() (packet *RedisPacket, err error) {
|
|||||||
packet.Value = val
|
packet.Value = val
|
||||||
}
|
}
|
||||||
case string:
|
case string:
|
||||||
packet.Value = x.(string)
|
packet.Value = v
|
||||||
case int64:
|
case int64:
|
||||||
packet.Value = fmt.Sprintf("%d", x.(int64))
|
packet.Value = fmt.Sprintf("%d", v)
|
||||||
default:
|
default:
|
||||||
msg := fmt.Sprintf("Unrecognized Redis data type: %v", reflect.TypeOf(x))
|
msg := fmt.Sprintf("Unrecognized Redis data type: %v", reflect.TypeOf(x))
|
||||||
err = errors.New(msg)
|
err = errors.New(msg)
|
||||||
@@ -493,7 +413,7 @@ func (p *RedisProtocol) processError() (interface{}, error) {
|
|||||||
func (p *RedisProtocol) parseTargetHostAndSlot(clusterRedirectResponse string) (host string, po int, slot int, err error) {
|
func (p *RedisProtocol) parseTargetHostAndSlot(clusterRedirectResponse string) (host string, po int, slot int, err error) {
|
||||||
arr := strings.Split(clusterRedirectResponse, " ")
|
arr := strings.Split(clusterRedirectResponse, " ")
|
||||||
host, port := p.extractParts(arr[2])
|
host, port := p.extractParts(arr[2])
|
||||||
slot, err = strconv.Atoi(arr[1])
|
slot, _ = strconv.Atoi(arr[1])
|
||||||
po, err = strconv.Atoi(port)
|
po, err = strconv.Atoi(port)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@@ -96,6 +96,9 @@ func (h *tcpReader) run(wg *sync.WaitGroup) {
|
|||||||
b := bufio.NewReader(h)
|
b := bufio.NewReader(h)
|
||||||
err := h.extension.Dissector.Dissect(b, h.isClient, h.tcpID, h.counterPair, h.superTimer, h.parent.superIdentifier, h.emitter, filteringOptions)
|
err := h.extension.Dissector.Dissect(b, h.isClient, h.tcpID, h.counterPair, h.superTimer, h.parent.superIdentifier, h.emitter, filteringOptions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
io.Copy(ioutil.Discard, b) //nolint
|
_, err = io.Copy(ioutil.Discard, b)
|
||||||
|
if err != nil {
|
||||||
|
logger.Log.Errorf("%v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user