6
6
import shutil
7
7
import signal
8
8
import sys
9
+ import _thread
10
+
11
+ import tornado
12
+ from tornado .http1connection import HTTP1Connection
13
+
9
14
import tabpy
15
+ import tabpy .tabpy_server .app .arrow_server as pa
10
16
from tabpy .tabpy import __version__
11
17
from tabpy .tabpy_server .app .app_parameters import ConfigParameters , SettingsParameters
12
18
from tabpy .tabpy_server .app .util import parse_pwd_file
26
32
StatusHandler ,
27
33
UploadDestinationHandler ,
28
34
)
29
- import tornado
30
- import tabpy .tabpy_server .app .arrow_server as pa
31
- import _thread
32
35
33
36
logger = logging .getLogger (__name__ )
34
37
@@ -62,6 +65,7 @@ class TabPyApp:
62
65
python_service = None
63
66
credentials = {}
64
67
arrow_server = None
68
+ max_request_size = None
65
69
66
70
def __init__ (self , config_file ):
67
71
if config_file is None :
@@ -116,11 +120,7 @@ def _get_arrow_server(self, config):
116
120
117
121
def run (self ):
118
122
application = self ._create_tornado_web_app ()
119
- max_request_size = (
120
- int (self .settings [SettingsParameters .MaxRequestSizeInMb ]) * 1024 * 1024
121
- )
122
- logger .info (f"Setting max request size to { max_request_size } bytes" )
123
-
123
+
124
124
init_model_evaluator (self .settings , self .tabpy_state , self .python_service )
125
125
126
126
protocol = self .settings [SettingsParameters .TransferProtocol ]
@@ -142,8 +142,8 @@ def run(self):
142
142
application .listen (
143
143
self .settings [SettingsParameters .Port ],
144
144
ssl_options = ssl_options ,
145
- max_buffer_size = max_request_size ,
146
- max_body_size = max_request_size ,
145
+ max_buffer_size = self . max_request_size ,
146
+ max_body_size = self . max_request_size ,
147
147
** settings ,
148
148
)
149
149
@@ -354,6 +354,12 @@ def _parse_config(self, config_file):
354
354
].lower ()
355
355
356
356
self ._validate_transfer_protocol_settings ()
357
+
358
+ # Set max request size in bytes
359
+ self .max_request_size = (
360
+ int (self .settings [SettingsParameters .MaxRequestSizeInMb ]) * 1024 * 1024
361
+ )
362
+ logger .info (f"Setting max request size to { self .max_request_size } bytes" )
357
363
358
364
# if state.ini does not exist try and create it - remove
359
365
# last dependence on batch/shell script
@@ -497,3 +503,16 @@ def _build_tabpy_state(self):
497
503
logger .info (f"Loading state from state file { state_file_path } " )
498
504
tabpy_state = _get_state_from_file (state_file_dir )
499
505
return tabpy_state , TabPyState (config = tabpy_state , settings = self .settings )
506
+
507
+
508
+ # Override _read_body to allow content with size exceeding max_body_size
509
+ # This enables proper handling of 413 errors in base_handler
510
+ def _read_body_allow_max_size (self , code , headers , delegate ):
511
+ if "Content-Length" in headers :
512
+ content_length = int (headers ["Content-Length" ])
513
+ if content_length > self ._max_body_size :
514
+ return
515
+ return self .original_read_body (code , headers , delegate )
516
+
517
+ HTTP1Connection .original_read_body = HTTP1Connection ._read_body
518
+ HTTP1Connection ._read_body = _read_body_allow_max_size
0 commit comments