如何编写lighttpd插件

2023-10-10 08:18
文章标签 编写 插件 lighttpd

本文主要是介绍如何编写lighttpd插件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分类: lighttpd 1096人阅读 评论(0) 收藏 举报
编写插件
在开始编写插件之前,应该先熟悉 lighttpd中两个基本数据结构以及他们所在文件:
  • buffer (buffer.c)
  • array (array.c)
  • global structures (base.h)
接下来需要阅读 :
  • http://www.lighttpd.net/documentation/state.html (在lighttpd的'doc/'目录下可以找到,名字为state.txt)
  • http://www.lighttpd.net/documentation/plugins.html (在lighttod的'doc/'目录下可以找到,名字为plugins.txt)
框架
确保你的系统中安装
  • automake 1.8.x or higher
  • autoconf 2.57 or higher
  • libtool 1.5.x or higher 
当要编写自己的插件,可以从修改mod_skeleton.c开始, mod_skeleton.c包括一个插件的基本架构,它是mod_access模块的一个拷贝,mod_access模块非常简单,以至于把mod_access模块作为演示插件如何工作的基本向导。

如何把mod_skeleton变成一个自己的插件,你需要用编辑器打开这个文件,把文件里面的 'skeleton'替换成你自己的插件名‘counter’。

$ cd src/
$ cp mod_skeleton.c mod_counter.c
$ vi mod_counter.c
:%s/skeleton/counter/g
把下面代码添加到 src/Makefile.am,告诉编译器我们需要创建新的插件:
lib_LTLIBRARIES += mod_counter.la
mod_counter_la_SOURCES = mod_counter.c

mod_counter_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined

mod_counter_la_LIBADD = $(common_libadd)
默认情况下,生成系统将假定你是一个普通用户,只是想编译现有代码。所以更改makefile.am文件后不会产生新的makefiles 。你需要手工执行以下命令:
$ ./configure --enable-maintainer-mode ...
无论何时更新 Makefile.am,比如增加新的依赖库,执行上面命令都会自动重建完整的Makefile文件.
开发过程中,如果你希望通过前缀安装所有的文件来避免真实安装,可以 :

$ ./configure --enable-maintainer-mode --prefix=${HOME}/testbed/lighttpd-1.4.x/ ...

这样可以消除你每次以 root身份安装的负担,并且不需要root权限就可以运行lighttpd。启动lighttpd之前,最好把lighttpd配置文件中的port修改为大于1024的端口。
如果开发的插件不能正常工作,您可能需要使用autoconf重新创建生成系统,如下命令
$autoreconf -fi
$./configure --enable-maintainer-mode ...
如果一切正确 , 生成目录中将会创建mod_counter.la 和 mod_counter.lo两个文件 .
调整代码

查看mod_counter插件. 你会发现:

  • 配置结构体: plugin_config和plugin_data。
  • 结构体初始化代码。
  • set_defaults函数分析配置结构。
  • the patch-function which applies the conditionals
  • the real work code and finally
  • plugin_init函数在插件注册服务时被调用一次。
plugin_config
每个插件在全局配置文件中可以选择是否设置配置信息,并且可以通过 plugin_config结构体记录这些不同的设置信息。这个结构体被用在结构体plugin_data结构中,用于保存插件的配置信息。
plugin_data
每个插件都有属于插件自身的本地数据 (像配置信息和临时缓存),通过plugin_data结构体保存这些数据。
handler_ctx
如果插件需要存储此次连接 (connection)的特定信息,需要用handler_ctx结构来存储每个连接的信息。更深入的了解可以参考mod_rewrite插件。
所需函数
  • _init
  • _free
  • _set_defaults
  • _plugin_init
_plugin_init
每个插件需要编写 ..._plugin_init函数,这个函数会在插件加载时被调用。需要设置p->name指向插件名字(用户定义的插件名,本例中为counter)缓存地址,设置相关的钩子(hooks)函数(init,set_defaults,cleanup),最后返回0即可。
_init
..._init函数在插件自身初始化时被调用,这个函数返回 plugin_data结构体指针。
_free
..._free 函数在插件生命期要结束时被调用,这个函数用来释放插件申请的内存,记住不要让程序结束时为你清理内存,请自己手动释放插件中申请的内存。考虑使用 valgrind或者其他工具分析验证你写的插件是否存在问题。
_set_defaults
一旦配置文件被解析,每个插件都有机会从配置文件中获取它的配置值,并验证正确性,在插件中使用 config_values_t结构体保存配置文件中相应的关键字和类型信息。需要注意的是Config_values_t结构体的最后一项必须用NULL标示结束。
如果你不关心插件配置, set_defaults功能是相当简单的:
  • set the destinations of the config_values_t
  • 调用config_insert_values_global()
conditionals
如果编写的插件需要配置信息,在调用 config_insert_values_global()函数之前还需要多做一些工作(就是对配置文件内容的解析处理),具体参考mod_access.c模块中的实现。
使用 config_storage存储所有的条件和一个patch函数(比如mod_counter_patch_connection函数)。

patch function sets the basic defaults and applies the necessary modifications for the currently valid conditionals.

Don't forget to check if the patched config makes sense when you use it.

The patch functions have to be called as soon as one of the work-handlers is called (like _uri_handler and friends).

        mod_counter_patch_connection(srv, con, p);

插件返回值
在大多数情况下,只需要使用 HANDLER_GO_ON, HANDLER_FINISHED and HANDLER_ERROR作为插件的返回值。
HANDLER_GO_ON:当你需要其他插件处理此次请求时,在多数情况下返回 HANDLER_GO_ON。有时如果你知道不需要处理这个请求,可以直接返回HANDLER_GO_ON。
HANDLER_ERROR:当发生致命错误时,当连接终止时,当调用 hanlers相关函数(产生错误时)或者终止lighttpd时,当调用_set_defaults函数时(主要指配置文件出错时)返回HANDLER_ERROR。
HANDLER_FINISHED: 终止返回值状态,在以下两种情况下返回:
  • 设置非200的状态码;
  • 生成完用户所需的内容;
HANDLER_WAIT_FOR_EVENT 和 HANDLER_WAIT_FOR_FD:当插件没有处理完成并等待fd-event或者执行FDs时,需要返回HANDLER_WAIT_FOR_EVENT或者HANDLER_WAIT_FOR_FD(这两种状态码用在异步事件处理的插件中,比如mod_proxy,mod_fastcgi等插件中,以后还会提到)
HANDLER_COMEBACK:当需要重新检查请求结构 (request-structur)时,需要返回HANDLER_COMEBACK状态码。在mod_rewrite插件中用于重写URI.
翻译原文:
http://trac.lighttpd.net/trac/wiki/HowToWriteALighttpdPlugin
说明:在这片文章的原文中作者没有严格区分plugin(插件)和module(模块)的概念,这里为了和原文一致,在出现plugin的地方翻译为插件,出现module的地方翻译为模块,两者表示相同的意思。对于patch-function部分,实在不好翻译,所以没有翻译,好在这部分内容容易理解。
初次翻译,有不合适的地方,欢迎大家批评指正。也希望和大家对lighttpd相关内容进行探讨。
本文版权归原文所有,转载请注明出处

这篇关于如何编写lighttpd插件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/179198

相关文章

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

maven中的maven-antrun-plugin插件示例详解

《maven中的maven-antrun-plugin插件示例详解》maven-antrun-plugin是Maven生态中一个强大的工具,尤其适合需要复用Ant脚本或实现复杂构建逻辑的场景... 目录1. 核心功能2. 典型使用场景3. 配置示例4. 关键配置项5. 优缺点分析6. 最佳实践7. 常见问题

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

Idea插件MybatisX失效的问题解决

《Idea插件MybatisX失效的问题解决》:本文主要介绍Idea插件MybatisX失效的问题解决,详细的介绍了4种问题的解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录一、重启idea或者卸载重装MyBATis插件(无需多言)二、检查.XML文件与.Java(该文件后缀Idea可能会隐藏

使用Java编写一个字符脱敏工具类

《使用Java编写一个字符脱敏工具类》这篇文章主要为大家详细介绍了如何使用Java编写一个字符脱敏工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、字符脱敏工具类2、测试工具类3、测试结果1、字符脱敏工具类import lombok.extern.slf4j.Slf4j

基于.NET编写工具类解决JSON乱码问题

《基于.NET编写工具类解决JSON乱码问题》在开发过程中,我们经常会遇到JSON数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题,下面我们就来编写一个.NET工具类来解... 目录问题背景核心原理工具类实现使用示例总结在开发过程中,我们经常会遇到jsON数据处理的问题,尤其是