@@ -20,7 +20,6 @@ use base64::engine::general_purpose::URL_SAFE;
2020use base64:: Engine as _;
2121use databend_common_base:: headers:: HEADER_SESSION ;
2222use databend_common_base:: headers:: HEADER_SESSION_ID ;
23- use databend_common_exception:: ErrorCode ;
2423use databend_common_meta_app:: tenant:: Tenant ;
2524use http:: HeaderMap ;
2625use jwt_simple:: prelude:: Deserialize ;
@@ -35,6 +34,7 @@ use serde::Deserializer;
3534use serde:: Serializer ;
3635use uuid:: Uuid ;
3736
37+ use crate :: servers:: http:: middleware:: ClientCapabilities ;
3838use crate :: servers:: http:: v1:: unix_ts;
3939use crate :: servers:: http:: v1:: ClientSessionManager ;
4040
@@ -78,10 +78,13 @@ impl ClientSessionHeader {
7878}
7979
8080impl ClientSession {
81- pub fn try_decode ( req : & Request ) -> Result < Option < ClientSession > , String > {
82- if let Some ( s) = Self :: from_custom_header ( req. headers ( ) ) ? {
81+ pub fn try_decode (
82+ req : & Request ,
83+ caps : & mut ClientCapabilities ,
84+ ) -> Result < Option < ClientSession > , String > {
85+ if let Some ( s) = Self :: from_custom_header ( req. headers ( ) , caps) ? {
8386 Ok ( Some ( s) )
84- } else if let Some ( s) = Self :: from_cookie ( req. cookie ( ) ) ? {
87+ } else if let Some ( s) = Self :: from_cookie ( req. cookie ( ) , caps ) ? {
8588 Ok ( Some ( s) )
8689 } else {
8790 Ok ( None )
@@ -111,11 +114,15 @@ impl ClientSession {
111114 }
112115 }
113116
114- fn from_custom_header ( headers : & HeaderMap ) -> Result < Option < ClientSession > , String > {
117+ fn from_custom_header (
118+ headers : & HeaderMap ,
119+ caps : & mut ClientCapabilities ,
120+ ) -> Result < Option < ClientSession > , String > {
115121 if let Some ( v) = headers. get ( HEADER_SESSION ) {
122+ caps. session_header = true ;
116123 let v = v. to_str ( ) . unwrap ( ) . to_string ( ) . trim ( ) . to_owned ( ) ;
117- // curl -H "X-xx:" not work
118- let s = if v . is_empty ( ) || v . to_lowercase ( ) == "new" {
124+ let s = if v . is_empty ( ) {
125+ // note that curl -H "X-xx:" not work
119126 Self :: new_session ( false )
120127 } else {
121128 let json = URL_SAFE . decode ( & v) . map_err ( |e| {
@@ -133,13 +140,18 @@ impl ClientSession {
133140 Self :: old_session ( false , header)
134141 } ;
135142 Ok ( Some ( s) )
143+ } else if caps. session_header {
144+ Ok ( Some ( Self :: new_session ( false ) ) )
136145 } else {
137146 Ok ( None )
138147 }
139148 }
140149
141- fn from_cookie ( cookie : & CookieJar ) -> Result < Option < ClientSession > , String > {
142- let cookie_enabled = cookie. get ( COOKIE_COOKIE_ENABLED ) . is_some ( ) ;
150+ fn from_cookie (
151+ cookie : & CookieJar ,
152+ caps : & mut ClientCapabilities ,
153+ ) -> Result < Option < ClientSession > , String > {
154+ let cookie_enabled = cookie. get ( COOKIE_COOKIE_ENABLED ) . is_some ( ) || caps. session_cookie ;
143155 if cookie_enabled {
144156 let s = if let Some ( sid) = cookie. get ( COOKIE_SESSION_ID ) {
145157 let id = sid. value_str ( ) . to_string ( ) ;
@@ -188,25 +200,17 @@ impl ClientSession {
188200 let client_session_mgr = ClientSessionManager :: instance ( ) ;
189201 match self . header . last_refresh_time . elapsed ( ) {
190202 Ok ( elapsed) => {
191- if is_worksheet
192- && elapsed
193- > client_session_mgr. max_idle_time + client_session_mgr. min_refresh_interval
194- {
195- return Err ( ErrorCode :: SessionTimeout ( format ! (
196- "session expired after idle for more than {} seconds" ,
197- client_session_mgr. max_idle_time. as_secs( )
198- ) ) ) ;
199- }
200- if elapsed > client_session_mgr. min_refresh_interval {
201- info ! (
202- "[HTTP-SESSION] refreshing session {} after {} seconds" ,
203- self . header. id,
204- elapsed. as_secs( ) ,
205- ) ;
203+ // worksheet
204+ if is_worksheet || elapsed > client_session_mgr. min_refresh_interval {
206205 if client_session_mgr. refresh_in_memory_states ( & self . header . id , user_name) {
207206 client_session_mgr
208207 . refresh_session_handle ( tenant, user_name. to_string ( ) , & self . header . id )
209208 . await ?;
209+ info ! (
210+ "[HTTP-SESSION] refreshing session {} after {} seconds" ,
211+ self . header. id,
212+ elapsed. as_secs( ) ,
213+ ) ;
210214 }
211215 self . refreshed = true ;
212216 if self . use_cookie {
0 commit comments