From a4bef98559a32112e76928b27429dc9e6c19dfd2 Mon Sep 17 00:00:00 2001 From: Waqas Hussain Date: Sun, 6 Jan 2013 04:55:53 +0500 Subject: net.server_event: Optimize socket write buffers (don't do buf=buf..newdata). --- net/server_event.lua | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'net') diff --git a/net/server_event.lua b/net/server_event.lua index e69530ff..08926939 100644 --- a/net/server_event.lua +++ b/net/server_event.lua @@ -40,6 +40,9 @@ local tostring = use "tostring" local coroutine = use "coroutine" local setmetatable = use "setmetatable" +local t_insert = table.insert +local t_concat = table.concat + local ssl = use "ssl" local socket = use "socket" or require "socket" @@ -309,7 +312,7 @@ do debug( "error:", err ) -- to much, check your app return nil, err end - self.writebuffer = self.writebuffer .. data -- new buffer + t_insert(self.writebuffer, data) -- new buffer self.writebufferlen = total if not self.eventwrite then -- register new write event --vdebug( "register new write event" ) @@ -466,7 +469,7 @@ do type = "client"; conn = client; currenttime = socket_gettime( ); -- safe the origin - writebuffer = ""; -- writebuffer + writebuffer = {}; -- writebuffer writebufferlen = 0; -- length of writebuffer send = client.send; -- caching table lookups receive = client.receive; @@ -520,10 +523,11 @@ do interface.eventwritetimeout = false end end - local succ, err, byte = interface.conn:send( interface.writebuffer, 1, interface.writebufferlen ) + interface.writebuffer = { t_concat(interface.writebuffer) } + local succ, err, byte = interface.conn:send( interface.writebuffer[1], 1, interface.writebufferlen ) --vdebug( "write data:", interface.writebuffer, "error:", err, "part:", byte ) if succ then -- writing succesful - interface.writebuffer = "" + interface.writebuffer[1] = nil interface.writebufferlen = 0 interface:ondrain(); if interface.fatalerror then @@ -539,7 +543,7 @@ do return -1 elseif byte and (err == "timeout" or err == "wantwrite") then -- want write again --vdebug( "writebuffer is not empty:", err ) - interface.writebuffer = string_sub( interface.writebuffer, byte + 1, interface.writebufferlen ) -- new buffer + interface.writebuffer[1] = string_sub( interface.writebuffer[1], byte + 1, interface.writebufferlen ) -- new buffer interface.writebufferlen = interface.writebufferlen - byte if "wantread" == err then -- happens only with luasec local callback = function( ) -- cgit v1.2.3 From 65a2b43b0d685790463d70d6d9062f604adb41f3 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Mon, 7 Jan 2013 02:20:43 +0100 Subject: net.server_select: Fix global access --- net/server_select.lua | 1 + 1 file changed, 1 insertion(+) (limited to 'net') diff --git a/net/server_select.lua b/net/server_select.lua index 97b9f199..122d774e 100644 --- a/net/server_select.lua +++ b/net/server_select.lua @@ -74,6 +74,7 @@ local idfalse local closeall local addsocket local addserver +local addtimer local getserver local wrapserver local getsettings -- cgit v1.2.3 From bea132059b61e3c1e4215e7a58cb83210a4db4fa Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Mon, 7 Jan 2013 02:21:03 +0100 Subject: net.server_select: Remove useless duplicated settimeout() call --- net/server_select.lua | 1 - 1 file changed, 1 deletion(-) (limited to 'net') diff --git a/net/server_select.lua b/net/server_select.lua index 122d774e..0852d444 100644 --- a/net/server_select.lua +++ b/net/server_select.lua @@ -238,7 +238,6 @@ wrapserver = function( listeners, socket, ip, serverport, pattern, sslctx, maxco local client, err = accept( socket ) -- try to accept if client then local ip, clientport = client:getpeername( ) - client:settimeout( 0 ) local handler, client, err = wrapconnection( handler, listeners, client, ip, serverport, clientport, pattern, sslctx ) -- wrap new client socket if err then -- error while wrapping ssl socket return false -- cgit v1.2.3 From a6731c13d10f67f5fb00b8a07b842b7e2aad7ff6 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Tue, 8 Jan 2013 13:33:01 +0100 Subject: net.http.parser: Abort if no status line is received. --- net/http/parser.lua | 1 + 1 file changed, 1 insertion(+) (limited to 'net') diff --git a/net/http/parser.lua b/net/http/parser.lua index b53dfa4e..64cf38c0 100644 --- a/net/http/parser.lua +++ b/net/http/parser.lua @@ -77,6 +77,7 @@ function httpstream.new(success_cb, error_cb, parser_type, options_cb) end end end + if not first_line then error = true; return error_cb("invalid-status-line"); end len = tonumber(headers["content-length"]); -- TODO check for invalid len if client then -- FIXME handle '100 Continue' response (by skipping it) -- cgit v1.2.3 From 2eddb12845d284554677ac9bfb79edf545f32a74 Mon Sep 17 00:00:00 2001 From: Florian Zeitz Date: Sat, 12 Jan 2013 17:26:50 +0100 Subject: net.http.server: Properly handle persistent connections --- net/http/server.lua | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'net') diff --git a/net/http/server.lua b/net/http/server.lua index 69908e4e..7cf25009 100644 --- a/net/http/server.lua +++ b/net/http/server.lua @@ -156,12 +156,23 @@ function handle_request(conn, request, finish_cb) local date_header = os_date('!%a, %d %b %Y %H:%M:%S GMT'); -- FIXME use local conn_header = request.headers.connection; - local keep_alive = conn_header == "Keep-Alive" or (request.httpversion == "1.1" and conn_header ~= "close"); + conn_header = conn_header and ","..conn_header:gsub("[ \t]", ""):lower().."," or "" + local httpversion = request.httpversion + local persistent = conn_header:find(",keep-alive,", 1, true) + or (httpversion == "1.1" and not conn_header:find(",close,", 1, true)); + + local response_conn_header; + if persistent then + response_conn_header = "Keep-Alive"; + else + response_conn_header = httpversion == "1.1" and "close" or nil + end local response = { request = request; status_code = 200; - headers = { date = date_header, connection = (keep_alive and "Keep-Alive" or "close") }; + headers = { date = date_header, connection = response_conn_header }; + persistent = persistent; conn = conn; send = _M.send_response; finish_cb = finish_cb; @@ -241,7 +252,7 @@ function _M.send_response(response, body) response:on_destroy(); response.on_destroy = nil; end - if headers.connection == "Keep-Alive" then + if response.persistent then response:finish_cb(); else response.conn:close(); -- cgit v1.2.3