-
Notifications
You must be signed in to change notification settings - Fork 4.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Pdk refine with optional cache to improvement performance #13981
base: master
Are you sure you want to change the base?
Conversation
…tent_type replacement
f5f8ba9
to
71e2a62
Compare
_G.ngx.req.read_body = function() | ||
-- for the same request, only one `read_body` call is needed | ||
if not ngx.ctx.body_read then | ||
read_req_body() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ngx.req.read_body
only need to be called once in a request lifetime. Although multiple calls in the same request
don't re-read data to buffer multiple times, there are still some extra cost of check logic. So we could just avoid it to gain better performance.
@@ -98,7 +96,7 @@ local function new(self) | |||
function _REQUEST.get_scheme() | |||
check_phase(PHASES.request) | |||
|
|||
return var.scheme | |||
return ngx.ctx.scheme or var.scheme |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ctx
is cheaper then var
, so use ctx
if exists, like what we do in router handling: local req_scheme = ctx and ctx.scheme or var.scheme
@@ -619,14 +617,14 @@ local function new(self) | |||
-- kong.request.get_header("Host") -- "foo.com" | |||
-- kong.request.get_header("x-custom-header") -- "bla" | |||
-- kong.request.get_header("X-Another") -- "foo bar" | |||
function _REQUEST.get_header(name) | |||
function _REQUEST.get_header(name, ctx) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
http_get_header
supports ctx
param to cache headers, expose it to get_header
API so we could use cache.
@@ -820,8 +818,7 @@ local function new(self) | |||
-- body.age -- "42" | |||
function _REQUEST.get_body(mimetype, max_args, max_allowed_file_size) | |||
check_phase(before_content) | |||
|
|||
local content_type = mimetype or _REQUEST.get_header(CONTENT_TYPE) | |||
local content_type = mimetype or ngx.var.http_content_type |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"Content-Type" is a built-in single value header, which means ngx.var.http_content_type
always returns the same value of get_header("Content-Type")
, and fetching single header by ngx.var
is quicker than get_header
(which may use get_headers()["Content-Type"]
to get the single header).
@@ -285,10 +285,11 @@ local function new(pdk, major_version) | |||
-- -- or `access` phase prior calling this function. | |||
-- | |||
-- local body = kong.service.response.get_raw_body() | |||
function response.get_raw_body() | |||
function response.get_raw_body(buffered_proxying) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
just a minor refinement so that if we could reduce the reads of ngx.ctx.buffered_proxying
by passing it by param
@@ -158,21 +158,22 @@ end | |||
|
|||
local function do_authentication(conf) | |||
local www_authenticate = "Basic realm=\"" .. conf.realm .. "\"" | |||
local ctx = {} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use a local ctx
here which is cheaper thanngx.ctx
, and the cache is only fresh in the local ctx
lifetime, not in the request lifetime, so we don't need ngx.ctx
Summary
Checklist
changelog/unreleased/kong
orskip-changelog
label added on PR if changelog is unnecessary. README.mdIssue reference
Fix #[issue number]