* theme (based on template)
* make own favicon.ico (now use opensuse ico instead)
* implement expand-conds for ssql
* sql-mapping syntax should support multi-sql code, but should deal with SQL-injection
* upload progress json feedback (need new server-core)
* SSE support, add some helper functions

* Support kqueue

* In MySQL, delete huge data in product environment will cause halt. There're two ways:
1. limit 1000 and loop
2. use store procedure

* Security stratage:
1. uri-decode should only be used in response-processing, never request-processing!
2. Any string which will be sent into DBI shouldn't be uri-decode in advanced!

* Reconsider security tokens fetching
Here's the discussion: http://wingolog.org/archives/2014/12/02/there-are-no-good-constant-time-data-structures

* Rewrite local-redirect-to for supporing controllers, and don't take use of "Location" header for it.
Just find out and call the rule handler directly.

* Ulimited categorizing. Use :categorize as shortcut. Two possible methods:
1. migrate a category table, and generate a lookup table each time before Artanis start.
It is hard to update category in runtime.
2. get category chain recursively, it should be fast in Scheme

* Add error waiter for current-task/client/server/proto, and bind them to somewhere they should not appear.
This may help developers to find out the possible bug.

* Optimize URL-remapping for better performance.

* Add server.idletimeout to shutdown a keep-alive connection when it's in idle status for the seconds specified by timeout.
This would be helpful to avoid EADDRNOTAVAIL that occurs too much.

* Support if-modified-since and if-request-match caching

* Support multi-subprotocol of Websocket

* Implement real non-blocking for sending regular file on Linux

* Implement OPTIONS return content by page-options
- Half finished
- Implement route

* Enhance Cache module
- Only options, don't let users call :cache explicitly
- Add hook before response (maybe rc-cache field?)
- Combine headers of emit and cache

#|
no-db-init
PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 1)
SSL_OptionSet(sslSocket, SSL_HANDSHAKE_AS_CLIENT, PR_TRUE)
s = connect()
tcp_sock = PR_ImportTCPSocket (s)
ssl_sock = SSL_ImportFD(NULL, tcpSocket)
PR_Write(sslSocket, buffer, n)
PR_Read(sslSocket, buffer, sizeof(buffer) - 1)
PR_Close(sslSocket)
SSL_ClearSessionCache();
NSS_Shutdown();
PR_Cleanup();

;; TODO: call NSS_Shutdown when artanis quit
|#
