@@ -35,12 +35,19 @@ def __init__(self, *,
3535 self ._autoclose = autoclose
3636 self ._autoping = autoping
3737
38- def start (self , request ):
38+ @asyncio .coroutine
39+ def prepare (self , request ):
3940 # make pre-check to don't hide it by do_handshake() exceptions
4041 resp_impl = self ._start_pre_check (request )
4142 if resp_impl is not None :
4243 return resp_impl
4344
45+ parser , protocol , writer = self ._pre_start (request )
46+ resp_impl = yield from super ().prepare (request )
47+ self ._post_start (request , parser , protocol , writer )
48+ return resp_impl
49+
50+ def _pre_start (self , request ):
4451 try :
4552 status , headers , parser , writer , protocol = do_handshake (
4653 request .method , request .headers , request .transport ,
@@ -59,17 +66,27 @@ def start(self, request):
5966 for k , v in headers :
6067 self .headers [k ] = v
6168 self .force_close ()
69+ return parser , protocol , writer
6270
63- resp_impl = super ().start (request )
64-
71+ def _post_start (self , request , parser , protocol , writer ):
6572 self ._reader = request ._reader .set_parser (parser )
6673 self ._writer = writer
6774 self ._protocol = protocol
6875 self ._loop = request .app .loop
6976
77+ def start (self , request ):
78+ warnings .warn ('use .prepare(request) instead' , DeprecationWarning )
79+ # make pre-check to don't hide it by do_handshake() exceptions
80+ resp_impl = self ._start_pre_check (request )
81+ if resp_impl is not None :
82+ return resp_impl
83+
84+ parser , protocol , writer = self ._pre_start (request )
85+ resp_impl = super ().start (request )
86+ self ._post_start (request , parser , protocol , writer )
7087 return resp_impl
7188
72- def can_start (self , request ):
89+ def can_prepare (self , request ):
7390 if self ._writer is not None :
7491 raise RuntimeError ('Already started' )
7592 try :
@@ -81,6 +98,10 @@ def can_start(self, request):
8198 else :
8299 return True , protocol
83100
101+ def can_start (self , request ):
102+ warnings .warn ('use .can_prepare(request) instead' , DeprecationWarning )
103+ return self .can_prepare (request )
104+
84105 @property
85106 def closed (self ):
86107 return self ._closed
@@ -98,22 +119,22 @@ def exception(self):
98119
99120 def ping (self , message = 'b' ):
100121 if self ._writer is None :
101- raise RuntimeError ('Call .start () first' )
122+ raise RuntimeError ('Call .prepare () first' )
102123 if self ._closed :
103124 raise RuntimeError ('websocket connection is closing' )
104125 self ._writer .ping (message )
105126
106127 def pong (self , message = 'b' ):
107128 # unsolicited pong
108129 if self ._writer is None :
109- raise RuntimeError ('Call .start () first' )
130+ raise RuntimeError ('Call .prepare () first' )
110131 if self ._closed :
111132 raise RuntimeError ('websocket connection is closing' )
112133 self ._writer .pong (message )
113134
114135 def send_str (self , data ):
115136 if self ._writer is None :
116- raise RuntimeError ('Call .start () first' )
137+ raise RuntimeError ('Call .prepare () first' )
117138 if self ._closed :
118139 raise RuntimeError ('websocket connection is closing' )
119140 if not isinstance (data , str ):
@@ -122,7 +143,7 @@ def send_str(self, data):
122143
123144 def send_bytes (self , data ):
124145 if self ._writer is None :
125- raise RuntimeError ('Call .start () first' )
146+ raise RuntimeError ('Call .prepare () first' )
126147 if self ._closed :
127148 raise RuntimeError ('websocket connection is closing' )
128149 if not isinstance (data , (bytes , bytearray , memoryview )):
@@ -151,7 +172,7 @@ def write_eof(self):
151172 @asyncio .coroutine
152173 def close (self , * , code = 1000 , message = b'' ):
153174 if self ._writer is None :
154- raise RuntimeError ('Call .start () first' )
175+ raise RuntimeError ('Call .prepare () first' )
155176
156177 if not self ._closed :
157178 self ._closed = True
@@ -190,7 +211,7 @@ def close(self, *, code=1000, message=b''):
190211 @asyncio .coroutine
191212 def receive (self ):
192213 if self ._reader is None :
193- raise RuntimeError ('Call .start () first' )
214+ raise RuntimeError ('Call .prepare () first' )
194215 if self ._waiting :
195216 raise RuntimeError ('Concurrent call to receive() is not allowed' )
196217
@@ -239,7 +260,7 @@ def receive(self):
239260 self ._waiting = False
240261
241262 @asyncio .coroutine
242- def receive_msg (self ): # pragma: no cover
263+ def receive_msg (self ):
243264 warnings .warn (
244265 'receive_msg() coroutine is deprecated. use receive() instead' ,
245266 DeprecationWarning )
0 commit comments