Skip to content

Commit f91a5c6

Browse files
committed
refactor: enable X-DATABEND-SESSION only when specified in caps.
1 parent b6c97a4 commit f91a5c6

File tree

3 files changed

+45
-19
lines changed

3 files changed

+45
-19
lines changed

src/query/service/src/servers/http/middleware/session_header.rs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -117,18 +117,15 @@ impl ClientSession {
117117
headers: &HeaderMap,
118118
caps: &mut ClientCapabilities,
119119
) -> Result<Option<ClientSession>, String> {
120-
if let Some(v) = headers.get(HEADER_SESSION) {
121-
caps.session_header = true;
122-
let v = v.to_str().unwrap().to_string().trim().to_owned();
123-
let s = if v.is_empty() {
124-
// note that curl -H "X-xx:" not work
125-
Self::new_session(false)
126-
} else {
127-
let header = decode_json_header(HEADER_SESSION, v.as_str())?;
128-
Self::old_session(false, header)
129-
};
130-
Ok(Some(s))
131-
} else if caps.session_header {
120+
if caps.session_header {
121+
if let Some(v) = headers.get(HEADER_SESSION) {
122+
caps.session_header = true;
123+
let v = v.to_str().unwrap().to_string().trim().to_owned();
124+
if !v.is_empty() {
125+
let header = decode_json_header(HEADER_SESSION, &v)?;
126+
return Ok(Some(Self::old_session(false, header)));
127+
};
128+
}
132129
Ok(Some(Self::new_session(false)))
133130
} else {
134131
Ok(None)

src/query/service/src/servers/http/v1/http_query_handlers.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,6 @@ async fn query_state_handler(
346346
let http_query_manager = HttpQueryManager::instance();
347347
match http_query_manager.get_query(&query_id) {
348348
Some(query) => {
349-
query.check_client_session_id(&ctx.client_session_id)?;
350349
if let Some(reason) = query.check_removed() {
351350
Err(query_id_removed(&query_id, reason))
352351
} else {

tests/suites/1_stateful/09_http_handler/09_0007_session.py

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from requests import Response
1111

1212
HEADER_SESSION = "X-DATABEND-SESSION"
13+
HEADER_CAPS = "X-DATABEND-CLIENT-CAPS"
1314
# Define the URLs and credentials
1415
query_url = "http://localhost:8000/v1/query"
1516
login_url = "http://localhost:8000/v1/session/login"
@@ -22,10 +23,9 @@ def wrapper(self, *args, **kwargs):
2223
print(f"---- {func.__name__}{args[:1]}")
2324
resp: Response = func(self, *args, **kwargs)
2425
self.session_header = resp.headers.get(HEADER_SESSION)
26+
json_str = base64.urlsafe_b64decode(self.session_header)
2527
last = self.session_header_json
26-
self.session_header_json = json.loads(
27-
base64.urlsafe_b64decode(self.session_header)
28-
)
28+
self.session_header_json = json.loads(json_str)
2929
if last:
3030
if last["id"] != self.session_header_json["id"]:
3131
print(
@@ -72,7 +72,7 @@ def login(self):
7272
auth=auth,
7373
headers={
7474
"Content-Type": "application/json",
75-
"X-DATABEND-CLIENT-CAPS": "session_header",
75+
HEADER_CAPS: "session_header",
7676
},
7777
json=payload,
7878
)
@@ -83,7 +83,10 @@ def do_logout(self, _case_id):
8383
response = self.client.post(
8484
logout_url,
8585
auth=auth,
86-
headers={HEADER_SESSION: self.session_header},
86+
headers={
87+
HEADER_CAPS: "session_header",
88+
HEADER_SESSION: self.session_header
89+
},
8790
)
8891
return response
8992

@@ -95,6 +98,7 @@ def do_query(self, query, url=query_url):
9598
auth=auth,
9699
headers={
97100
"Content-Type": "application/json",
101+
HEADER_CAPS: "session_header",
98102
HEADER_SESSION: self.session_header,
99103
},
100104
json=query_payload,
@@ -109,7 +113,7 @@ def set_fake_last_refresh_time(self):
109113
).decode("ascii")
110114

111115

112-
def main():
116+
def test_session():
113117
client = Client()
114118
client.login()
115119

@@ -134,6 +138,32 @@ def main():
134138
pprint(query_resp.get("session").get("need_keep_alive"))
135139

136140

141+
# without X-DATABEND-CLIENT-CAPS:
142+
# 1. query still works
143+
# 2. X-DATABEND-SESSION is ignored
144+
def test_no_session():
145+
client = requests.session()
146+
payload = {"sql": "select * from numbers(100)", "pagination": {"max_rows_per_page": 2}}
147+
resp = client.post(
148+
query_url,
149+
auth=auth,
150+
headers={"Content-Type": "application/json", HEADER_SESSION: "xxx"},
151+
json=payload,
152+
)
153+
resp = resp.json()
154+
next_uri = resp.get("next_uri")
155+
resp = client.get(
156+
f"http://localhost:8000/{next_uri}",
157+
auth=auth,
158+
)
159+
resp = resp.json()
160+
assert len(resp["data"]) == 2, resp
161+
162+
def main():
163+
test_no_session()
164+
test_session()
165+
166+
137167
if __name__ == "__main__":
138168
import logging
139169

0 commit comments

Comments
 (0)