blob: 1e6dc9463b327bbef349256bb54356c0eac9d757 [file] [log] [blame]
Victor Stinner24f8ebf2014-01-23 11:05:01 +01001.. currentmodule:: asyncio
2
Victor Stinner9592edb2014-02-02 15:03:02 +01003.. _asyncio-streams:
Victor Stinner4b4f9eb2014-01-24 17:33:20 +01004
Victor Stinner1374bd42014-01-24 15:34:19 +01005++++++++++++++++++++++++
6Streams (high-level API)
7++++++++++++++++++++++++
Victor Stinner24f8ebf2014-01-23 11:05:01 +01008
9Stream functions
10================
11
Victor Stinner08444382014-02-02 22:43:39 +010012.. function:: open_connection(host=None, port=None, \*, loop=None, limit=None, **kwds)
Victor Stinner24f8ebf2014-01-23 11:05:01 +010013
14 A wrapper for :meth:`~BaseEventLoop.create_connection()` returning a (reader,
15 writer) pair.
16
17 The reader returned is a :class:`StreamReader` instance; the writer is
18 a :class:`StreamWriter` instance.
19
20 The arguments are all the usual arguments to
21 :meth:`BaseEventLoop.create_connection` except *protocol_factory*; most
22 common are positional host and port, with various optional keyword arguments
23 following.
24
25 Additional optional keyword arguments are *loop* (to set the event loop
26 instance to use) and *limit* (to set the buffer limit passed to the
27 :class:`StreamReader`).
28
29 (If you want to customize the :class:`StreamReader` and/or
30 :class:`StreamReaderProtocol` classes, just copy the code -- there's really
31 nothing special here except some convenience.)
32
Yury Selivanov37f15bc2014-02-20 16:20:44 -050033 This function is a :ref:`coroutine <coroutine>`.
Victor Stinner24f8ebf2014-01-23 11:05:01 +010034
Victor Stinner08444382014-02-02 22:43:39 +010035.. function:: start_server(client_connected_cb, host=None, port=None, \*, loop=None, limit=None, **kwds)
Victor Stinner24f8ebf2014-01-23 11:05:01 +010036
Victor Stinner8ebeb032014-07-11 23:47:40 +020037 Start a socket server, with a callback for each client connected. The return
38 value is the same as :meth:`~BaseEventLoop.create_server()`.
Victor Stinner24f8ebf2014-01-23 11:05:01 +010039
Victor Stinner8ebeb032014-07-11 23:47:40 +020040 The *client_connected_cb* parameter is called with two parameters:
Victor Stinner24f8ebf2014-01-23 11:05:01 +010041 *client_reader*, *client_writer*. *client_reader* is a
42 :class:`StreamReader` object, while *client_writer* is a
Victor Stinner8ebeb032014-07-11 23:47:40 +020043 :class:`StreamWriter` object. The *client_connected_cb* parameter can
44 either be a plain callback function or a :ref:`coroutine function
45 <coroutine>`; if it is a coroutine function, it will be automatically
Victor Stinner337e03f2014-08-11 01:11:13 +020046 converted into a :class:`Task`.
Victor Stinner24f8ebf2014-01-23 11:05:01 +010047
48 The rest of the arguments are all the usual arguments to
49 :meth:`~BaseEventLoop.create_server()` except *protocol_factory*; most
Victor Stinner8ebeb032014-07-11 23:47:40 +020050 common are positional *host* and *port*, with various optional keyword
51 arguments following.
Victor Stinner24f8ebf2014-01-23 11:05:01 +010052
53 Additional optional keyword arguments are *loop* (to set the event loop
54 instance to use) and *limit* (to set the buffer limit passed to the
55 :class:`StreamReader`).
56
Yury Selivanov37f15bc2014-02-20 16:20:44 -050057 This function is a :ref:`coroutine <coroutine>`.
Victor Stinner24f8ebf2014-01-23 11:05:01 +010058
Yury Selivanovd3f8e302014-02-20 14:10:02 -050059.. function:: open_unix_connection(path=None, \*, loop=None, limit=None, **kwds)
60
61 A wrapper for :meth:`~BaseEventLoop.create_unix_connection()` returning
62 a (reader, writer) pair.
63
64 See :func:`open_connection` for information about return value and other
65 details.
66
Yury Selivanov37f15bc2014-02-20 16:20:44 -050067 This function is a :ref:`coroutine <coroutine>`.
Yury Selivanovd3f8e302014-02-20 14:10:02 -050068
69 Availability: UNIX.
70
71.. function:: start_unix_server(client_connected_cb, path=None, \*, loop=None, limit=None, **kwds)
72
73 Start a UNIX Domain Socket server, with a callback for each client connected.
74
75 See :func:`start_server` for information about return value and other
76 details.
77
Yury Selivanov37f15bc2014-02-20 16:20:44 -050078 This function is a :ref:`coroutine <coroutine>`.
Yury Selivanovd3f8e302014-02-20 14:10:02 -050079
80 Availability: UNIX.
81
Victor Stinner24f8ebf2014-01-23 11:05:01 +010082
83StreamReader
84============
85
Victor Stinner08444382014-02-02 22:43:39 +010086.. class:: StreamReader(limit=None, loop=None)
Victor Stinner24f8ebf2014-01-23 11:05:01 +010087
88 .. method:: exception()
89
90 Get the exception.
91
92 .. method:: feed_eof()
93
Yury Selivanovd3f8e302014-02-20 14:10:02 -050094 Acknowledge the EOF.
Victor Stinner24f8ebf2014-01-23 11:05:01 +010095
96 .. method:: feed_data(data)
97
Yury Selivanovd3f8e302014-02-20 14:10:02 -050098 Feed *data* bytes in the internal buffer. Any operations waiting
99 for the data will be resumed.
Victor Stinner24f8ebf2014-01-23 11:05:01 +0100100
101 .. method:: set_exception(exc)
102
103 Set the exception.
104
105 .. method:: set_transport(transport)
106
107 Set the transport.
108
109 .. method:: read(n=-1)
110
Yury Selivanovd3f8e302014-02-20 14:10:02 -0500111 Read up to *n* bytes. If *n* is not provided, or set to ``-1``,
112 read until EOF and return all read bytes.
113
114 If the EOF was received and the internal buffer is empty,
115 return an empty ``bytes`` object.
Victor Stinner24f8ebf2014-01-23 11:05:01 +0100116
Yury Selivanov37f15bc2014-02-20 16:20:44 -0500117 This method is a :ref:`coroutine <coroutine>`.
Victor Stinner24f8ebf2014-01-23 11:05:01 +0100118
119 .. method:: readline()
120
Yury Selivanovd3f8e302014-02-20 14:10:02 -0500121 Read one line, where "line" is a sequence of bytes ending with ``\n``.
122
123 If EOF is received, and ``\n`` was not found, the method will
124 return the partial read bytes.
125
126 If the EOF was received and the internal buffer is empty,
127 return an empty ``bytes`` object.
Victor Stinner24f8ebf2014-01-23 11:05:01 +0100128
Yury Selivanov37f15bc2014-02-20 16:20:44 -0500129 This method is a :ref:`coroutine <coroutine>`.
Victor Stinner24f8ebf2014-01-23 11:05:01 +0100130
131 .. method:: readexactly(n)
132
Victor Stinnerb7f19ff2014-01-27 11:58:49 +0100133 Read exactly *n* bytes. Raise an :exc:`IncompleteReadError` if the end of
134 the stream is reached before *n* can be read, the
135 :attr:`IncompleteReadError.partial` attribute of the exception contains
136 the partial read bytes.
Victor Stinner24f8ebf2014-01-23 11:05:01 +0100137
Yury Selivanov37f15bc2014-02-20 16:20:44 -0500138 This method is a :ref:`coroutine <coroutine>`.
Victor Stinner24f8ebf2014-01-23 11:05:01 +0100139
Yury Selivanovd3f8e302014-02-20 14:10:02 -0500140 .. method:: at_eof()
141
142 Return ``True`` if the buffer is empty and :meth:`feed_eof` was called.
143
Victor Stinner24f8ebf2014-01-23 11:05:01 +0100144
145StreamWriter
146============
147
148.. class:: StreamWriter(transport, protocol, reader, loop)
149
150 Wraps a Transport.
151
152 This exposes :meth:`write`, :meth:`writelines`, :meth:`can_write_eof()`,
153 :meth:`write_eof`, :meth:`get_extra_info` and :meth:`close`. It adds
154 :meth:`drain` which returns an optional :class:`Future` on which you can
155 wait for flow control. It also adds a transport attribute which references
156 the :class:`Transport` directly.
157
158 .. attribute:: transport
159
160 Transport.
161
Victor Stinnerffbe3c62014-02-08 22:50:07 +0100162 .. method:: can_write_eof()
163
164 Return :const:`True` if the transport supports :meth:`write_eof`,
165 :const:`False` if not. See :meth:`WriteTransport.can_write_eof`.
166
Victor Stinner24f8ebf2014-01-23 11:05:01 +0100167 .. method:: close()
168
169 Close the transport: see :meth:`BaseTransport.close`.
170
171 .. method:: drain()
172
Victor Stinner62f8ecc2014-01-24 18:47:26 +0100173 Wait until the write buffer of the underlying transport is flushed.
Victor Stinner24f8ebf2014-01-23 11:05:01 +0100174
Victor Stinnerd71dcbb2014-08-25 17:04:12 +0200175 The intended use is to write::
Victor Stinner24f8ebf2014-01-23 11:05:01 +0100176
177 w.write(data)
178 yield from w.drain()
179
Victor Stinnerd71dcbb2014-08-25 17:04:12 +0200180 When the transport buffer is full (the protocol is paused), block until
181 the buffer is (partially) drained and the protocol is resumed. When there
182 is nothing to wait for, the yield-from continues immediately.
183
184 This method is a :ref:`coroutine <coroutine>`.
Victor Stinner24f8ebf2014-01-23 11:05:01 +0100185
186 .. method:: get_extra_info(name, default=None)
187
188 Return optional transport information: see
189 :meth:`BaseTransport.get_extra_info`.
190
191 .. method:: write(data)
192
193 Write some *data* bytes to the transport: see
194 :meth:`WriteTransport.write`.
195
196 .. method:: writelines(data)
197
198 Write a list (or any iterable) of data bytes to the transport:
199 see :meth:`WriteTransport.writelines`.
200
Victor Stinner24f8ebf2014-01-23 11:05:01 +0100201 .. method:: write_eof()
202
203 Close the write end of the transport after flushing buffered data:
204 see :meth:`WriteTransport.write_eof`.
205
206
207StreamReaderProtocol
208====================
209
210.. class:: StreamReaderProtocol(stream_reader, client_connected_cb=None, loop=None)
211
212 Trivial helper class to adapt between :class:`Protocol` and
213 :class:`StreamReader`. Sublclass of :class:`Protocol`.
214
215 *stream_reader* is a :class:`StreamReader` instance, *client_connected_cb*
216 is an optional function called with (stream_reader, stream_writer) when a
217 connection is made, *loop* is the event loop instance to use.
218
219 (This is a helper class instead of making :class:`StreamReader` itself a
220 :class:`Protocol` subclass, because the :class:`StreamReader` has other
221 potential uses, and to prevent the user of the :class:`StreamReader` to
222 accidentally call inappropriate methods of the protocol.)
223
Victor Stinnerc520edc2014-01-23 11:25:48 +0100224
Victor Stinnerb7f19ff2014-01-27 11:58:49 +0100225IncompleteReadError
226===================
227
228.. exception:: IncompleteReadError
229
Victor Stinner32970b82014-01-27 12:18:49 +0100230 Incomplete read error, subclass of :exc:`EOFError`.
Victor Stinnerb7f19ff2014-01-27 11:58:49 +0100231
232 .. attribute:: expected
233
234 Total number of expected bytes (:class:`int`).
235
236 .. attribute:: partial
237
238 Read bytes string before the end of stream was reached (:class:`bytes`).
239
240
Victor Stinner5121a9b2014-10-11 15:52:14 +0200241Stream examples
242===============
243
Victor Stinnered051592014-10-12 20:18:16 +0200244.. _asyncio-tcp-echo-client-streams:
245
246TCP echo client using streams
247-----------------------------
248
249TCP echo client using the :func:`asyncio.open_connection` function::
250
251 import asyncio
252
253 def tcp_echo_client(message, loop):
254 reader, writer = yield from asyncio.open_connection('127.0.0.1', 8888,
255 loop=loop)
256
257 print('Send: %r' % message)
258 writer.write(message.encode())
259
260 data = yield from reader.read(100)
261 print('Received: %r' % data.decode())
262
263 print('Close the socket')
264 writer.close()
265
266 message = 'Hello World!'
267 loop = asyncio.get_event_loop()
268 loop.run_until_complete(tcp_echo_client(message, loop))
269 loop.close()
270
271.. seealso::
272
273 The :ref:`TCP echo client protocol <asyncio-tcp-echo-client-protocol>`
274 example uses the :meth:`BaseEventLoop.create_connection` method.
275
276
277.. _asyncio-tcp-echo-server-streams:
278
279TCP echo server using streams
280-----------------------------
281
282TCP echo server using the :func:`asyncio.start_server` function::
283
284 import asyncio
285
286 @asyncio.coroutine
287 def handle_echo(reader, writer):
288 data = yield from reader.read(100)
289 message = data.decode()
290 addr = writer.get_extra_info('peername')
291 print("Received %r from %r" % (message, addr))
292
293 print("Send: %r" % message)
294 writer.write(data)
295 yield from writer.drain()
296
297 print("Close the client socket")
298 writer.close()
299
300 loop = asyncio.get_event_loop()
301 coro = asyncio.start_server(handle_echo, '127.0.0.1', 8888, loop=loop)
302 server = loop.run_until_complete(coro)
303
304 # Serve requests until CTRL+c is pressed
305 print('Serving on {}'.format(server.sockets[0].getsockname()))
306 try:
307 loop.run_forever()
308 except KeyboardInterrupt:
309 pass
310
311 # Close the server
312 server.close()
313 loop.run_until_complete(server.wait_closed())
314 loop.close()
315
316.. seealso::
317
318 The :ref:`TCP echo server protocol <asyncio-tcp-echo-server-protocol>`
319 example uses the :meth:`BaseEventLoop.create_server` method.
320
321
Victor Stinner5121a9b2014-10-11 15:52:14 +0200322Get HTTP headers
323----------------
Victor Stinnerc520edc2014-01-23 11:25:48 +0100324
325Simple example querying HTTP headers of the URL passed on the command line::
326
327 import asyncio
328 import urllib.parse
329 import sys
330
331 @asyncio.coroutine
332 def print_http_headers(url):
333 url = urllib.parse.urlsplit(url)
Victor Stinner5121a9b2014-10-11 15:52:14 +0200334 if url.scheme == 'https':
335 connect = asyncio.open_connection(url.hostname, 443, ssl=True)
336 else:
337 connect = asyncio.open_connection(url.hostname, 80)
338 reader, writer = yield from connect
339 query = ('HEAD {path} HTTP/1.0\r\n'
340 'Host: {hostname}\r\n'
341 '\r\n').format(path=url.path or '/', hostname=url.hostname)
Victor Stinnerc520edc2014-01-23 11:25:48 +0100342 writer.write(query.encode('latin-1'))
343 while True:
344 line = yield from reader.readline()
345 if not line:
346 break
347 line = line.decode('latin1').rstrip()
348 if line:
349 print('HTTP header> %s' % line)
350
Victor Stinner5121a9b2014-10-11 15:52:14 +0200351 # Ignore the body, close the socket
352 writer.close()
353
Victor Stinnerc520edc2014-01-23 11:25:48 +0100354 url = sys.argv[1]
355 loop = asyncio.get_event_loop()
356 task = asyncio.async(print_http_headers(url))
357 loop.run_until_complete(task)
Victor Stinnerf40c6632014-01-28 23:32:40 +0100358 loop.close()
Victor Stinnerc520edc2014-01-23 11:25:48 +0100359
360Usage::
361
362 python example.py http://example.com/path/page.html
363
Victor Stinner04e6df32014-10-11 16:16:27 +0200364or with HTTPS::
365
366 python example.py https://example.com/path/page.html
367
368.. _asyncio-register-socket-streams:
369
370Register an open socket to wait for data using streams
371------------------------------------------------------
372
373Coroutine waiting until a socket receives data using the
374:func:`open_connection` function::
375
376 import asyncio
Victor Stinnerccd8e342014-10-11 16:30:02 +0200377 try:
378 from socket import socketpair
379 except ImportError:
380 from asyncio.windows_utils import socketpair
Victor Stinner04e6df32014-10-11 16:16:27 +0200381
382 def wait_for_data(loop):
383 # Create a pair of connected sockets
Victor Stinnerccd8e342014-10-11 16:30:02 +0200384 rsock, wsock = socketpair()
Victor Stinner04e6df32014-10-11 16:16:27 +0200385
386 # Register the open socket to wait for data
387 reader, writer = yield from asyncio.open_connection(sock=rsock, loop=loop)
388
389 # Simulate the reception of data from the network
390 loop.call_soon(wsock.send, 'abc'.encode())
391
392 # Wait for data
393 data = yield from reader.read(100)
394
395 # Got data, we are done: close the socket
396 print("Received:", data.decode())
397 writer.close()
398
399 # Close the second socket
400 wsock.close()
401
402 loop = asyncio.get_event_loop()
403 loop.run_until_complete(wait_for_data(loop))
404 loop.close()
405
406.. seealso::
407
408 The :ref:`register an open socket to wait for data using a protocol
409 <asyncio-register-socket>` example uses a low-level protocol created by the
410 :meth:`BaseEventLoop.create_connection` method.
411
412 The :ref:`watch a file descriptor for read events
413 <asyncio-watch-read-event>` example uses the low-level
414 :meth:`BaseEventLoop.add_reader` method to register the file descriptor of a
415 socket.
416