From e2e9e119d670ec80954fc8c018b479b218a7e47e Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Fri, 20 Jun 2008 16:47:25 +0000 Subject: [PATCH] * Moved luci.http.protocol to libs/http * Added ltn12 to libs/core * Fixed libs/httpd Makefile --- NOTICE | 1 + contrib/package/luci/Makefile | 16 +- libs/core/lua/ltn12.lua | 314 ++++++++++++++++++ libs/http/Makefile | 2 + libs/{httpd => http}/luasrc/http/protocol.lua | 0 libs/httpd/Makefile | 13 +- 6 files changed, 333 insertions(+), 13 deletions(-) create mode 100644 libs/core/lua/ltn12.lua create mode 100644 libs/http/Makefile rename libs/{httpd => http}/luasrc/http/protocol.lua (100%) diff --git a/NOTICE b/NOTICE index e2c3383e3..7d9ed9801 100644 --- a/NOTICE +++ b/NOTICE @@ -6,6 +6,7 @@ Licensed under the Apache License, Version 2.0. Contains code from: BinDecHex - Copyright 2007 Tim Kelly/Dialectronics coxpcall - Copyright 2005 - Kepler Project (www.keplerproject.org) +ltn12/luasocket - Copyright 2004-2007 Diego Nehab Luci-Statistics - Statistics for LuCI diff --git a/contrib/package/luci/Makefile b/contrib/package/luci/Makefile index b2571f750..8b03f7956 100644 --- a/contrib/package/luci/Makefile +++ b/contrib/package/luci/Makefile @@ -132,9 +132,19 @@ define Package/luci-fastindex/install endef +define Package/luci-http + $(call Package/luci/libtemplate) + TITLE:=HTTP Protocol implementation +endef + +define Package/luci-http/install + $(call Package/luci/install/template,$(1),libs/http) +endef + + define Package/luci-web $(call Package/luci/libtemplate) - DEPENDS+=+luci-addons +luci-uci + DEPENDS+=+luci-http +luci-addons +luci-uci TITLE:=MVC Webframework endef @@ -384,6 +394,9 @@ endif ifneq ($(CONFIG_PACKAGE_luci-fastindex),) PKG_SELECTED_MODULES+=libs/fastindex endif +ifneq ($(CONFIG_PACKAGE_luci-http),) + PKG_SELECTED_MODULES+=libs/http +endif ifneq ($(CONFIG_PACKAGE_luci-uci),) PKG_SELECTED_MODULES+=libs/uci endif @@ -455,6 +468,7 @@ MAKE_FLAGS += MODULES="$(PKG_SELECTED_MODULES)" LUA_TARGET="$(LUA_TARGET)" CFLAG $(eval $(call BuildPackage,luci-core)) $(eval $(call BuildPackage,luci-cbi)) $(eval $(call BuildPackage,luci-fastindex)) +$(eval $(call BuildPackage,luci-http)) $(eval $(call BuildPackage,luci-uci)) $(eval $(call BuildPackage,luci-web)) diff --git a/libs/core/lua/ltn12.lua b/libs/core/lua/ltn12.lua new file mode 100644 index 000000000..417da84d5 --- /dev/null +++ b/libs/core/lua/ltn12.lua @@ -0,0 +1,314 @@ +--[[ +LuaSocket 2.0.2 license +Copyright � 2004-2007 Diego Nehab + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +]]-- +----------------------------------------------------------------------------- +-- LTN12 - Filters, sources, sinks and pumps. +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: ltn12.lua,v 1.31 2006/04/03 04:45:42 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module +----------------------------------------------------------------------------- +local string = require("string") +local table = require("table") +local base = _G +module("ltn12") + +filter = {} +source = {} +sink = {} +pump = {} + +-- 2048 seems to be better in windows... +BLOCKSIZE = 2048 +_VERSION = "LTN12 1.0.1" + +----------------------------------------------------------------------------- +-- Filter stuff +----------------------------------------------------------------------------- +-- returns a high level filter that cycles a low-level filter +function filter.cycle(low, ctx, extra) + base.assert(low) + return function(chunk) + local ret + ret, ctx = low(ctx, chunk, extra) + return ret + end +end + +-- chains a bunch of filters together +-- (thanks to Wim Couwenberg) +function filter.chain(...) + local n = table.getn(arg) + local top, index = 1, 1 + local retry = "" + return function(chunk) + retry = chunk and retry + while true do + if index == top then + chunk = arg[index](chunk) + if chunk == "" or top == n then return chunk + elseif chunk then index = index + 1 + else + top = top+1 + index = top + end + else + chunk = arg[index](chunk or "") + if chunk == "" then + index = index - 1 + chunk = retry + elseif chunk then + if index == n then return chunk + else index = index + 1 end + else base.error("filter returned inappropriate nil") end + end + end + end +end + +----------------------------------------------------------------------------- +-- Source stuff +----------------------------------------------------------------------------- +-- create an empty source +local function empty() + return nil +end + +function source.empty() + return empty +end + +-- returns a source that just outputs an error +function source.error(err) + return function() + return nil, err + end +end + +-- creates a file source +function source.file(handle, io_err) + if handle then + return function() + local chunk = handle:read(BLOCKSIZE) + if not chunk then handle:close() end + return chunk + end + else return source.error(io_err or "unable to open file") end +end + +-- turns a fancy source into a simple source +function source.simplify(src) + base.assert(src) + return function() + local chunk, err_or_new = src() + src = err_or_new or src + if not chunk then return nil, err_or_new + else return chunk end + end +end + +-- creates string source +function source.string(s) + if s then + local i = 1 + return function() + local chunk = string.sub(s, i, i+BLOCKSIZE-1) + i = i + BLOCKSIZE + if chunk ~= "" then return chunk + else return nil end + end + else return source.empty() end +end + +-- creates rewindable source +function source.rewind(src) + base.assert(src) + local t = {} + return function(chunk) + if not chunk then + chunk = table.remove(t) + if not chunk then return src() + else return chunk end + else + table.insert(t, chunk) + end + end +end + +function source.chain(src, f) + base.assert(src and f) + local last_in, last_out = "", "" + local state = "feeding" + local err + return function() + if not last_out then + base.error('source is empty!', 2) + end + while true do + if state == "feeding" then + last_in, err = src() + if err then return nil, err end + last_out = f(last_in) + if not last_out then + if last_in then + base.error('filter returned inappropriate nil') + else + return nil + end + elseif last_out ~= "" then + state = "eating" + if last_in then last_in = "" end + return last_out + end + else + last_out = f(last_in) + if last_out == "" then + if last_in == "" then + state = "feeding" + else + base.error('filter returned ""') + end + elseif not last_out then + if last_in then + base.error('filter returned inappropriate nil') + else + return nil + end + else + return last_out + end + end + end + end +end + +-- creates a source that produces contents of several sources, one after the +-- other, as if they were concatenated +-- (thanks to Wim Couwenberg) +function source.cat(...) + local src = table.remove(arg, 1) + return function() + while src do + local chunk, err = src() + if chunk then return chunk end + if err then return nil, err end + src = table.remove(arg, 1) + end + end +end + +----------------------------------------------------------------------------- +-- Sink stuff +----------------------------------------------------------------------------- +-- creates a sink that stores into a table +function sink.table(t) + t = t or {} + local f = function(chunk, err) + if chunk then table.insert(t, chunk) end + return 1 + end + return f, t +end + +-- turns a fancy sink into a simple sink +function sink.simplify(snk) + base.assert(snk) + return function(chunk, err) + local ret, err_or_new = snk(chunk, err) + if not ret then return nil, err_or_new end + snk = err_or_new or snk + return 1 + end +end + +-- creates a file sink +function sink.file(handle, io_err) + if handle then + return function(chunk, err) + if not chunk then + handle:close() + return 1 + else return handle:write(chunk) end + end + else return sink.error(io_err or "unable to open file") end +end + +-- creates a sink that discards data +local function null() + return 1 +end + +function sink.null() + return null +end + +-- creates a sink that just returns an error +function sink.error(err) + return function() + return nil, err + end +end + +-- chains a sink with a filter +function sink.chain(f, snk) + base.assert(f and snk) + return function(chunk, err) + if chunk ~= "" then + local filtered = f(chunk) + local done = chunk and "" + while true do + local ret, snkerr = snk(filtered, err) + if not ret then return nil, snkerr end + if filtered == done then return 1 end + filtered = f(done) + end + else return 1 end + end +end + +----------------------------------------------------------------------------- +-- Pump stuff +----------------------------------------------------------------------------- +-- pumps one chunk from the source to the sink +function pump.step(src, snk) + local chunk, src_err = src() + local ret, snk_err = snk(chunk, src_err) + if chunk and ret then return 1 + else return nil, src_err or snk_err end +end + +-- pumps all data from a source to a sink, using a step function +function pump.all(src, snk, step) + base.assert(src and snk) + step = step or pump.step + while true do + local ret, err = step(src, snk) + if not ret then + if err then return nil, err + else return 1 end + end + end +end + diff --git a/libs/http/Makefile b/libs/http/Makefile new file mode 100644 index 000000000..f7fac7740 --- /dev/null +++ b/libs/http/Makefile @@ -0,0 +1,2 @@ +include ../../build/config.mk +include ../../build/module.mk diff --git a/libs/httpd/luasrc/http/protocol.lua b/libs/http/luasrc/http/protocol.lua similarity index 100% rename from libs/httpd/luasrc/http/protocol.lua rename to libs/http/luasrc/http/protocol.lua diff --git a/libs/httpd/Makefile b/libs/httpd/Makefile index ee1a40ea8..f7fac7740 100644 --- a/libs/httpd/Makefile +++ b/libs/httpd/Makefile @@ -1,13 +1,2 @@ -include ../../build/module.mk include ../../build/config.mk -include ../../build/gccconfig.mk - -%.o: %.c - $(COMPILE) $(LUA_CFLAGS) $(FPIC) -c -o $@ $< - -compile: src/fastindex.o - mkdir -p dist$(LUCI_LIBRARYDIR) - $(LINK) $(SHLIB_FLAGS) -o dist$(LUCI_LIBRARYDIR)/fastindex.so src/fastindex.o $(LUA_SHLIBS) - -clean: - rm -f src/*.o +include ../../build/module.mk -- 2.25.1