feat: add socket handle module for runner.
diff --git a/src/runner/socket/handle.py b/src/runner/socket/handle.py
new file mode 100644
index 0000000..14942ce
--- /dev/null
+++ b/src/runner/socket/handle.py
@@ -0,0 +1,78 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+from a6pluginproto.Err import Resp as A6ErrResp
+from a6pluginproto.Err import Code as A6ErrCode
+import runner.plugin.cache as RunnerPluginCache
+import runner.plugin.execute as RunnerPluginExecute
+import runner.http.request as RunnerHttpRequest
+import runner.http.response as RunnerHttpResponse
+import runner.http.protocol as RunnerHttpProtocol
+
+
+class Handle:
+
+    def __init__(self, req_type, req_data):
+        self.req_type = req_type
+        self.req_data = req_data
+
+    def RpcPrepareConf(self):
+        # init request
+        req = RunnerHttpRequest.Request(RunnerHttpProtocol.RPC_PREPARE_CONF, self.req_data)
+        # generate token
+        token = RunnerPluginCache.generateToken()
+        # get plugins config
+        configs = req.getConfigs()
+        # cache plugins config
+        RunnerPluginCache.setConfigByToken(token, configs)
+        # init response
+        reps = RunnerHttpResponse.Response(RunnerHttpProtocol.RPC_PREPARE_CONF)
+
+        return reps.setToken(token).responseToFlatBuffers()
+
+    def RpcHttpReqCall(self):
+        # init request
+        req = RunnerHttpRequest.Request(RunnerHttpProtocol.RPC_HTTP_REQ_CALL, self.req_data)
+        # get request token
+        token = req.getConfToken()
+        # get plugins
+        configs = RunnerPluginCache.getConfigByToken(token)
+        # init response
+        reps = RunnerHttpResponse.Response(RunnerHttpProtocol.RPC_HTTP_REQ_CALL)
+        # execute plugins
+        RunnerPluginExecute.executeFilter(configs, req, reps)
+
+        return reps.responseToFlatBuffers()
+
+    def RpcTest(self):
+        pass
+
+    def RpcUnknown(self):
+        builder = RunnerHttpProtocol.newBuilder()
+        A6ErrResp.Start(builder)
+        A6ErrResp.AddCode(builder, A6ErrCode.Code.BAD_REQUEST)
+        res = A6ErrResp.End(builder)
+        builder.Finish(res)
+        return builder
+
+    def dispatch(self):
+        handler = {
+            RunnerHttpProtocol.RPC_UNKNOWN: self.RpcUnknown,
+            RunnerHttpProtocol.RPC_TEST: self.RpcTest,
+            RunnerHttpProtocol.RPC_PREPARE_CONF: self.RpcPrepareConf,
+            RunnerHttpProtocol.RPC_HTTP_REQ_CALL: self.RpcHttpReqCall,
+        }
+        return {"type": self.req_type, "data": handler.get(self.req_type, self.RpcUnknown)().Output()}