a = "GET /hello" b = "GET/hello" i, j = string.find(a, " ") print(i, j) i, j = string.find(b, " ") print(i, j) local function get_method(request) idx_begin, idx_end = string.find(request, " ") if idx_begin == nil then return "" else return string.sub(request, 1, idx_begin - 1) end end print("[" .. get_method("get /abc") .. "]") print("[" .. get_method("get/abc") .. "]") local function get_url(request) -- Pass true for 4th param to indicate that pattern is not a regex. idx_begin = string.find(request, " ", 1, true) if idx_begin == nil then return "" end idx_begin = idx_begin + 1 idx_end = string.find(request, " ", idx_begin, true) if idx_end == nil then idx_end = -1 else idx_end = idx_end - 1 end return string.sub(request, idx_begin, idx_end) end print("[" .. get_url("get /abc?y=3 asd") .. "]") print("[" .. get_url("get/abc") .. "]") local function get_servlet(request) url = get_url(request) if url == "" then return "" end idx_begin = string.find(request, "/", 2, true) if idx_begin == nil then return "" end idx_begin = idx_begin + 1 idx_end = string.find(request, " ", idx_begin, true) if idx_end == nil then idx_end = -1 else idx_end = idx_end - 1 end return string.sub(request, idx_begin, idx_end) end local function get_servlet(url) servlet = nil part = nil -- does it look like http://www.google.com/servlet_1/servlet_2?param=x string.gsub(url, "^.*://[^/]*/(.*)", function(g) part = g; return "" end) -- does it look like /servlet_1/servlet_2?param=x if part == nil then string.gsub(url, "^/(.*)", function(g) part = g; return "" end) end if part == nil then return "" end string.gsub(part, "^([^&?]*)", function(g) servlet = g; return "" end) if servlet == nil then return "" else return servlet end end print(get_servlet("http://google.com/servlet/more?q=1")) print(get_servlet("/servlet/more?q=1")) print(get_servlet("/servlet/more?q=1"))