blob: f20265771ad77c6dd576f461ebae66db91ebb39e [file] [log] [blame]
#
# 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.
#
import json
import runner.http.method as RunnerHttpMethod
import runner.http.protocol as RunnerHttpProtocol
import runner.plugin.loading as RunnerPluginLoading
from a6pluginproto.HTTPReqCall import Req as A6HTTPReqCallReq
from a6pluginproto.PrepareConf import Req as A6PrepareConfReq
class Request(object):
def __init__(self, rpc_type: int, buf: bytes):
self.request = {}
self.setRpcType(rpc_type)
self.initRequest(buf)
def setRpcType(self, rpc_type: int) -> None:
self.request["rpc_type"] = rpc_type
def getRpcType(self) -> int:
return self.request.get("rpc_type", 0)
def setConfToken(self, conf_token: int) -> None:
self.request["conf_token"] = conf_token
def getConfToken(self) -> int:
return self.request.get("conf_token", 0)
def getId(self) -> int:
return self.request.get("id", 0)
def setId(self, id: int) -> None:
self.request["id"] = id
def getMethod(self) -> str:
return self.request.get("method", "")
def setMethod(self, method: str) -> None:
self.request["method"] = method
def getPath(self) -> str:
return self.request.get("path", "")
def setPath(self, path: str) -> None:
self.request["path"] = path
def setHeaders(self, headers: dict) -> None:
self.request["headers"] = headers
def getHeaders(self) -> dict:
return self.request.get("headers", {})
def setConfigs(self, headers: dict) -> None:
self.request["configs"] = headers
def getConfigs(self) -> dict:
return self.request.get("configs", {})
def setArgs(self, args: dict) -> None:
self.request["args"] = args
def getArgs(self) -> dict:
return self.request.get("args", {})
def getSourceIP(self) -> str:
return self.request.get("src_ip", "")
def setSourceIP(self, ip: str) -> None:
self.request["src_ip"] = ip
def initRequest(self, buf: bytes) -> None:
if self.getRpcType() == RunnerHttpProtocol.RPC_HTTP_REQ_CALL:
req = A6HTTPReqCallReq.Req.GetRootAsReq(buf)
self.setId(req.Id())
self.setMethod(RunnerHttpMethod.getNameByCode(req.Method()))
self.setPath(str(req.Path(), encoding="UTF-8"))
self.setConfToken(req.ConfToken())
if not req.SrcIpIsNone():
delimiter = "."
if req.SrcIpLength() > 4:
delimiter = ":"
ipAddress = []
for i in range(req.SrcIpLength()):
ipAddress.append(str(req.SrcIp(i)))
self.setSourceIP(delimiter.join(ipAddress))
if not req.HeadersIsNone():
headers = {}
for i in range(req.HeadersLength()):
key = str(req.Headers(i).Name(), encoding="UTF-8")
val = str(req.Headers(i).Value(), encoding="UTF-8")
headers[key] = val
self.setHeaders(headers)
if not req.ArgsIsNone():
args = {}
for i in range(req.ArgsLength()):
key = str(req.Args(i).Name(), encoding="UTF-8")
val = str(req.Args(i).Value(), encoding="UTF-8")
args[key] = val
self.setArgs(args)
if self.getRpcType() == RunnerHttpProtocol.RPC_PREPARE_CONF:
req = A6PrepareConfReq.Req.GetRootAsReq(buf)
plugins = RunnerPluginLoading.instances()
configs = {}
if not req.ConfIsNone():
for i in range(req.ConfLength()):
name = str(req.Conf(i).Name(), encoding="UTF-8").lower()
plugin = plugins.get(name)
if not plugin:
continue
value = str(req.Conf(i).Value(), encoding="UTF-8")
plugin = plugin()
plugin.setConfig(json.loads(value))
configs[name] = plugin
self.setConfigs(configs)