summaryrefslogtreecommitdiffhomepage
path: root/src/python (follow)
AgeCommit message (Collapse)AuthorFilesLines
2022-04-26Removed special cases for non-NXT_CONF_VALUE_ARRAY.Alejandro Colomar1-11/+2
The previous commit added more generic APIs for handling NXT_CONF_VALUE_ARRAY and non-NXT_CONF_VALUE_ARRAY together. Modify calling code to remove special cases for arrays and non-arrays, taking special care that the path for non arrays is logically equivalent to the previous special cased code. Use the now-generic array code only.
2022-02-09Python: fixing debug message field type.Max Romanov1-1/+2
Introduced in the 78864c9d5ba8 commit. Sorry about that.
2022-02-08Python: fixing incorrect function object dereference.Max Romanov1-6/+12
The __call__ method can be native and not be a PyFunction type. A type check is thus required before accessing op_code and other fields. Reproduced on Ubuntu 21.04, Python 3.9.4 and Falcon framework: here, the App.__call__ method is compiled with Cython, so accessing op_code->co_flags is invalid; accidentally, the COROUTINE bit is set which forces the Python module into the ASGI mode. The workaround is explicit protocol specification. Note: it is impossible to specify the legacy mode for ASGI.
2021-10-28Moving request limit control to libunit.Max Romanov6-85/+16
Introducting application graceful stop. For now only used when application process reach request limit value. This closes #585 issue on GitHub.
2021-10-28Python: creating and reusing asgi_add_reader() wrapper.Max Romanov1-62/+21
2021-08-09Python: fixing misprint in error message.Max Romanov1-2/+2
2021-07-20Python: using default event_loop for main thread for ASGI.Max Romanov4-16/+22
Unit's ASGI implementation creates a new event loop to run an application for each thread since 542b5b8c0647. This may cause unexpected exceptions or strange bugs if asyncio synchronisation primitives are initialised before the application starts (e.g. globally). Although the approach with a new event loop for the main thread is consistent and helps to prepare the application to run in multiple threads, it can be a source of pain for people who just want to run single-threaded ASGI applications in Unit. This is related to #560 issue on GitHub.
2021-07-20Python: fixing exceptions in Future.set_result for ASGI implementation.Max Romanov1-23/+32
An ASGI application can cancel the Future object returned by the receive() call. In this case, Unit's ASGI implementation should not call set_result() because the Future is already handled. In particular, the Starlette framework was noted to cancel the received Future. This patch adds a done() check for the Future before attempting a set_result(). This is related to #564 issue on GitHub.
2021-07-20Python: fixing ASGI receive() issues.Max Romanov1-33/+54
The receive() call never blocks for a GET request and always returns the same empty body message. The Starlette framework creates a separate task when receive() is called in a loop until an 'http.disconnect' message is received. The 'http.disconnect' message was previously issued after the response header had been sent. However, the correct behavior is to respond with 'http.disconnect' after sending the response is complete. This closes #564 issue on GitHub.
2021-05-20Python: support for multiple targets.Oisin Canty6-70/+250
2020-12-29Libunit: processing single port message.Max Romanov1-13/+28
This partially reverts the optimisation introduced in 1d84b9e4b459 to avoid an unpredictable block in nxt_unit_process_port_msg(). Under high load, this function may never return control to its caller, and the external event loop (in Node.js and Python asyncio) won't be able to process other scheduled events. To reproduce the issue, two request processing types are needed: 'fast' and 'furious'. The 'fast' one simply returns a small response, while the 'furious' schedules asynchronous calls to external resources. Thus, if Unit is subjected to a large amount of 'fast' requests, the 'furious' request processing freezes until the high load ends. The issue was found by Wu Jian Ping (@wujjpp) during Node.js stream implementation discussion and relates to PR #502 on GitHub.
2020-12-22Python: multiple values in the "path" option.Valentin Bartenev1-27/+76
2020-12-14Python: WSGI environment copying moved out of request processing.Valentin Bartenev1-12/+53
The WSGI environment dictionary contains a number of static items, that are pre-initialized on application start. Then it's copied for each request to be filled with request-related data. Now this dictionary copy operation will be done between processing of requests, which should save some CPU cycles during request processing and thus reduce response latency for non-peak load periods.
2020-11-18Python: improving ASGI http send message processing.Max Romanov1-12/+13
2020-11-18Libunit: closing active requests on quit.Max Romanov3-2/+66
2020-11-10Python: supporting ASGI legacy protocol.Max Romanov4-27/+151
Introducing manual protocol selection for 'universal' apps and frameworks.
2020-11-05Python: fixing some arguments reference counting.Max Romanov1-33/+130
2020-11-05Python: request processing in multiple threads.Max Romanov10-497/+920
This closes #459 issue on GitHub.
2020-11-05Python: introducting macro to simplify minor version check.Max Romanov1-1/+3
2020-10-13Fixed building with Python 3.9.Valentin Bartenev2-2/+3
PyUnicode_GET_SIZE() in deprecated since 3.3 and will be removed in 3.12. In version 3.9 it was explicitly marked by deprecation warning causing compilation error with Unit. PyUnicode_GET_LENGTH() must be used instead.
2020-10-01Python: ASGI server introduced.Max Romanov10-29/+3723
This closes #461 issue on GitHub.
2020-09-18Python: app module callable name configuration.Max Romanov1-5/+8
Now it is possible to specify the name of the application callable using optional parameter 'callable'. Default value is 'application'. This closes #290 issue on GitHub.
2020-09-15Python: changed request headers format in router protocol.Max Romanov1-10/+106
The coming ASGI support requires raw HTTP headers format. Headers grouping and upcase code were moved to WSGI module.
2020-09-14Python: split module initialization from WSGI implementation.Max Romanov3-285/+387
This is required for futher ASGI implementation.
2020-09-14Python: source file moved to 'python' sub-directory.Max Romanov1-0/+1446
No functional changes. Get ready for an increase in file number.