`
hqhe1982
  • 浏览: 11259 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

ngx_tcc_module-20110720 (用C语言编写网页后台脚本)

阅读更多

ngx_tcc_module是一个nginx http模块,它把tcc编译器内嵌到nginx,用来编译C语言编写的网页后台脚本。

 

每个页面由两个文件组成:

*.csp,是主要用HTML编写的文件,里面会内嵌一些C代码。

*.c,纯C编写的代码文件,里面主要是做一些业务逻辑的处理。

 

下载:

https://github.com/downloads/hehaiqiang/ngwsx/ngx_tcc_module-20110720.rar

 

代码示例:

index.csp

<%
/* This is a "c server page (CSP)" */
static int  i;
%>
<html>
<head>
</head>
<body>
<% for (i = 0; i < 5; i++) { %>
<a href="<%=url%>" target="_blank"><%=title%></a>
<% } %>
</body>
</html>

 

index.c

#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>


#define NGX_DBD_OPT_NON_BLOCKING  0x01


static void row_handler(ngx_http_request_t *r);


static void    *dbd;
static u_char  *url = "";
static u_char  *title = "";


static void
finalize(ngx_http_request_t *r, ngx_int_t rc)
{
    ngx_tcc_dbd_close(dbd);
    ngx_tcc_dbd_destroy(dbd);

    ngx_tcc_finalize(r, rc);
}


static void
field_handler(ngx_http_request_t *r)
{
    off_t       offset;
    size_t      size, total;
    u_char     *value;
    ngx_int_t   rc;

    for ( ;; ) {

        rc = ngx_tcc_dbd_field_read(dbd, &value, &offset, &size, &total);

        if (rc == NGX_AGAIN) {
            return;
        }

        if (rc == NGX_ERROR) {
            finalize(r, rc);
            return;
        }

        if (rc == NGX_DONE) {
            break;
        }

        /* TODO: value, offset, size, total */

        ngx_tcc_output(r, value, size);
        ngx_tcc_output_str(r, "&nbsp;&nbsp;");
    }

    ngx_tcc_output_str(r, "<br/>");

    ngx_tcc_dbd_set_handler(dbd, row_handler, r);
    row_handler(r);
}


static void
row_handler(ngx_http_request_t *r)
{
    ngx_int_t  rc;

    for ( ;; ) {

        rc = ngx_tcc_dbd_row_read(dbd);

        if (rc == NGX_AGAIN) {
            return;
        }

        if (rc == NGX_ERROR) {
            finalize(r, rc);
            return;
        }

        if (rc == NGX_DONE) {
            break;
        }

        ngx_tcc_dbd_set_handler(dbd, field_handler, r);
        field_handler(r);

        return;
    }

    url = "http://www.126.com/";
    title = "126.com";

    finalize(r, NGX_OK);
}


static void
column_handler(ngx_http_request_t *r)
{
    size_t      size;
    u_char     *buf;
    ngx_int_t   rc;

    for ( ;; ) {

        rc = ngx_tcc_dbd_column_read(dbd);

        if (rc == NGX_AGAIN) {
            return;
        }

        if (rc == NGX_ERROR) {
            finalize(r, rc);
            return;
        }

        if (rc == NGX_DONE) {
            break;
        }

        buf = (u_char *) ngx_tcc_dbd_column_name(dbd);
        size = ngx_strlen(buf);
        ngx_tcc_output(r, buf, size);
        ngx_tcc_output_str(r, "&nbsp;&nbsp;");
    }

    ngx_tcc_output_str(r, "<br/>");

    ngx_tcc_dbd_set_handler(dbd, row_handler, r);
    row_handler(r);
}


static void
result_handler(ngx_http_request_t *r)
{
    ngx_int_t  rc;

    rc = ngx_tcc_dbd_query(dbd);

    if (rc == NGX_AGAIN) {
        return;
    }

    if (rc == NGX_ERROR) {
        finalize(r, rc);
        return;
    }

    ngx_tcc_dbd_set_handler(dbd, column_handler, r);
    column_handler(r);
}


static void
connect_handler(ngx_http_request_t *r)
{
    ngx_int_t  rc;

    rc = ngx_tcc_dbd_connect(dbd);

    if (rc == NGX_AGAIN) {
        return;
    }

    if (rc == NGX_ERROR) {
        ngx_tcc_dbd_destroy(dbd);
        ngx_tcc_finalize(r);
        return;
    }

    /* TODO: escape sql */

    ngx_tcc_dbd_set_sql(dbd, "show databases", sizeof("show databases") - 1);

    ngx_tcc_dbd_set_handler(dbd, result_handler, r);
    result_handler(r);
}


__declspec(dllexport) void
handler(ngx_http_request_t *r)
{
    ngx_int_t  rc;

    dbd = (void *) ngx_tcc_dbd_create(r, "libdrizzle");

    ngx_tcc_dbd_set_options(dbd, NGX_DBD_OPT_NON_BLOCKING);
    ngx_tcc_dbd_set_tcp(dbd, "127.0.0.1", 3306);
    ngx_tcc_dbd_set_db(dbd, "mysql");
    ngx_tcc_dbd_set_auth(dbd, "root", "123456");

    ngx_tcc_dbd_set_handler(dbd, connect_handler, r);
    connect_handler(r);
}

 

0
5
分享到:
评论

相关推荐

    ngx_lua_module-windows-1.1.2.0

    ngx_lua_module是一款强大的扩展模块,专为Nginx服务器设计,允许在Nginx配置文件中直接嵌入Lua脚本,极大地增强了Nginx的功能和灵活性。这个"ngx_lua_module-windows-1.1.2.0"是该模块的一个Windows版本,适应于...

    ngx_http_proxy_connect_module-master (2).zip

    用于nginx的http正向代理https使用的模块

    ngx_devel_kit-0.3.0

    ngx_devel_kit(通常缩写为 NDK)是一个针对Nginx的模块开发工具集,它为构建自定义Nginx模块提供了便利。在Nginx生态系统中,NDK是一个重要的扩展工具,允许开发者利用C语言直接操作Nginx的内部结构,以实现更高级...

    ngx_http_proxy_connect_module.zip

    例如,如果你已经下载了Nginx的源代码,可以使用`--add-module=路径/ngx_http_proxy_connect_module`命令行选项。 3. 编译和安装:运行`./configure`,然后`make`和`make install`以编译并安装带有新模块的Nginx。 4...

    ngx_http_consistent_hash-master.zip

    Nginx 支持模块化设计,允许开发者通过编写模块来扩展其功能。ngx_http_consistent_hash 模块是这样的一个例子,它将一致性哈希的功能集成到 Nginx 中。 4. **配置和使用:** 在 Nginx 配置文件中,用户需要引入...

    ngx_devel_kit-0.2.19.tar.gz

    4. 使用Nginx的configure脚本,通过指定--add-module选项添加NDK模块,例如:`./configure --add-module=路径/ngx_devel_kit-0.2.19`。 5. 编译并安装Nginx:`make && make install`。 6. 更新Nginx配置文件,启用...

    nginx_upstream_check_module-master.zip

    nginx自带是没有针对负载均衡后端节点的健康检查的,但是可以通过默认自带的ngx_http_proxy_module 模块和ngx_http_upstream_module模块中的相关指令来完成当后端节点出现故障时,自动切换到健康节点来提供访问。

    ngx_stream_ssl_preread_module调研.docx

    NGX_STREAM_SSL_PREREAD_MODULE 模块调研 NGX_STREAM_SSL_PREREAD_MODULE 是一个基于流媒体(Stream)实现的 SSL/TLS 协议 ClientHello 消息提取模块,主要用于提取 SNI(Server Name Indicate)或者 ALPN...

    nginx-sticky-module-1.25.zip

    下载后,在编译安装nginx时,用--add-module选项,指到sticky所在目录。类似命令如下: ./configure --prefix=/usr/local/nginx-1.6.0 --add-module=../nginx-sticky-module-1.25 --without-http_ssi_module --...

    ngx_cache_purge_2.4.2.tar.gz

    这个版本2.4.2的压缩包包含了ngx_cache_purge模块的所有源代码及相关文件,以便开发者在自己的Nginx环境中集成和使用。 Nginx是一款高性能、轻量级的Web服务器和反向代理服务器,广泛应用于互联网服务。其内置的...

    ngx_cache_purge-2.0.tar.gz

    1. **源代码**:这是实现模块功能的核心部分,由C语言编写,需要与Nginx的源码进行编译链接。 2. **README文件**:通常会提供安装、配置和使用模块的基本指导。 3. **LICENSE文件**:说明该模块的开源许可协议,可能...

    ngx_http_dav_ext_module.so

    ngx_http_dav_ext_module.so centos7 nginx 1.18 可以作为模块加载

    ngx_image_thumb-master.zip

    1. **源代码文件**:通常包含C语言编写的源代码,如.c和.h文件,这些文件实现了图片处理的逻辑和Nginx模块接口。 2. **配置文件**:如Makefile或者configure脚本,用于编译和构建模块,确保它能正确地与Nginx集成。 ...

    nginx-1.25.4-x86-64-ngx-http-proxy-connect-module

    增加了ngx_http_proxy_connect_module模块的,已经编译好的windows exe文件。 可以正向代理https请求。来源地址:https://github.com/dyq94310/nginx-build-msys2/releases 使用方法,放到从官网下的nginx windows...

    Openresty_For_Windows_1.7.10.zip

    ngx-coolkit-module echo-nginx-module form-input-nginx-module encrypted-session-nginx-module set-misc-nginx-module ngx-postgres-module ngx-lua-module ngx_lua_upstream headers-more-nginx-module rds-json...

    ngx_stream_module.so

    nginx1.20.2

    Nginx安装+nginx_upstream_check_module后端健康检查

    --add-module=../ngx_cache_purge-2.3 make make install ``` - **--prefix**: 指定安装路径。 - **--with-http_ssl_module**: 启用SSL支持。 - **--with-http_stub_status_module**: 启用状态监控模块。 - **--...

    nginx限制连接数ngx_http_limit_conn_module模块1

    【Nginx 限制连接数 ngx_http_limit_conn_module 模块详解】 在互联网服务中,服务器经常面临流量异常、负载过大的情况,尤其在遭受大流量恶意攻击时,带宽的浪费、服务器压力的增大都会对业务造成严重影响。为了...

Global site tag (gtag.js) - Google Analytics