1
+ from http .server import HTTPServer , BaseHTTPRequestHandler
2
+ import pythonmonkey as pm
3
+ import threading
4
+ import asyncio
5
+ import json
6
+
7
+ def test_xhr ():
8
+ class TestHTTPRequestHandler (BaseHTTPRequestHandler ):
9
+ def log_request (self , * args ) -> None :
10
+ return
11
+
12
+ def do_GET (self ):
13
+ self .send_response (200 )
14
+ self .end_headers ()
15
+ self .wfile .write (b"get response" )
16
+
17
+ def do_POST (self ):
18
+ self .send_response (200 )
19
+ self .send_header ('Content-Type' , 'application/json' )
20
+ self .end_headers ()
21
+ length = int (self .headers .get ('Content-Length' ))
22
+ json_string = self .rfile .read (length ).decode ("utf-8" )
23
+ parameter_dict = json .loads (json_string )
24
+ parameter_dict ["User-Agent" ] = self .headers ['User-Agent' ]
25
+ data = json .dumps (parameter_dict ).encode ("utf-8" )
26
+ self .wfile .write (data )
27
+
28
+ httpd = HTTPServer (('localhost' , 4001 ), TestHTTPRequestHandler )
29
+ thread = threading .Thread (target = httpd .serve_forever )
30
+ thread .daemon = True
31
+ thread .start ()
32
+
33
+ async def async_fn ():
34
+ assert "get response" == await pm .eval ("""
35
+ new Promise(function (resolve, reject) {
36
+ let xhr = new XMLHttpRequest();
37
+ xhr.open('GET', 'http://localhost:4001');
38
+
39
+ xhr.onload = function ()
40
+ {
41
+ if (this.status >= 200 && this.status < 300)
42
+ {
43
+ resolve(this.response);
44
+ }
45
+ else
46
+ {
47
+ reject(new Error(JSON.stringify({
48
+ status: this.status,
49
+ statusText: this.statusText
50
+ })));
51
+ }
52
+ };
53
+
54
+ xhr.onerror = function (ev)
55
+ {
56
+ reject(ev.error);
57
+ };
58
+ xhr.send();
59
+ });
60
+ """ )
61
+
62
+ post_result = await pm .eval ("""
63
+ new Promise(function (resolve, reject)
64
+ {
65
+ let xhr = new XMLHttpRequest();
66
+ xhr.open('POST', 'http://localhost:4001');
67
+
68
+ xhr.onload = function ()
69
+ {
70
+ if (this.status >= 200 && this.status < 300)
71
+ {
72
+ resolve(this.response);
73
+ }
74
+ else
75
+ {
76
+ reject(new Error(JSON.stringify({
77
+ status: this.status,
78
+ statusText: this.statusText
79
+ })));
80
+ }
81
+ };
82
+
83
+ xhr.onerror = function (ev)
84
+ {
85
+ console.log(ev)
86
+ reject(ev.error);
87
+ };
88
+
89
+ xhr.send(JSON.stringify({fromPM: "snakesandmonkeys"}));
90
+ })
91
+ """ )
92
+
93
+ result_json = json .loads (post_result )
94
+ assert result_json ["fromPM" ] == "snakesandmonkeys"
95
+ assert result_json ["User-Agent" ].startswith ("Python/" )
96
+ httpd .shutdown ()
97
+ asyncio .run (async_fn ())
0 commit comments