您的位置:首页 > 编程语言 > Go语言

将Mongoose webserver嵌入到你的应用

2012-05-07 22:13 316 查看
http://zhiwei.li/text/2009/11/%E5%B0%86mongoose-webserver%E5%B5%8C%E5%85%A5%E5%88%B0%E4%BD%A0%E7%9A%84%E5%BA%94%E7%94%A8/

下载下面3个文件到某个目录

_mongoose.dll
http://mongoose.googlecode.com/svn/trunk/bindings/csharp/mongoose.cs http://mongoose.googlecode.com/svn/trunk/bindings/csharp/example.cs
在MS Visual Studio编译C#范例, 或者使用命令行编译器

csc example.cs mongoose.cs

然后运行example.exe, 用浏览器打开 http://127.0.0.1:8080/foo
当Mongoose被嵌入到应用时, 运行时有两个明显的步骤

1. 开始和配置web服务器. 所有函数 都使用 struct mg_context *作为一个参数,除了mg_start()函数,它启动web服务器,返回一个 struct mg_context *, 所以,必须先调用它.

2. 为客户的请求服务. 在配置阶段, 可以注册URI hanlder: 在客户请求某种URL时,被调用. 这些函数是异步调用的. 只有那些注册了handler的URI才可以访问.

在每个用户回调中,HTTP请求信息被传递,在URI处理器内, 用户可以调用函数来回复,取得HTTP头部等

所有函数都需要struct mg_connection *作为一个参数.

数据结构

struct mg_context Mongoose 环境, 也称实例句柄

struct mg_connection HTTP连接句柄

struct mg_request_info HTTP请求信息. 这个结构被传递给URI处理函数.

开始,配置,停止Mongoose实例

struct mg_contect *mg_start(void)

在一个单独的线程里开始Mongoose服务器实例. 返回实例句柄(Mongoose上下文). 这个上下文

在后面同服务器的交互中需要,比如设置选项,停止服务等等

void mg_stop(struct mg_context *)

在关闭服务的最后 调用,释放所有相关资源. 这个将会阻塞,直到所有的Mongoose线程停止.

const char *mg_get_option(struct mg_context *context, const char *option_name)

返回特定选项的当前值

int mg_set_option(struct mg_context *context, const char *option_name, const char *option_value)

设置一个特定的选项. 选项值被复制. 选项的值 必须是一个有效的 以nul字节结束的ASCII或者UTF-8字符串. 可以在任意时候改变选项值. 如果选项是未知的,返回-1. 0表示设置失败哦, 1表示成功.

void mg_set_uri_callback(struct mg_context *context, const char *uri_regx, mg_callback_t func, void *user_data)

注册一个URI处理函数. 在uri_regx使用”*”(星号,匹配0到多个字符), 可以处理多个URI

user_data 指针 被作为第 3个参数 传递给 处理函数 .如果为NULL, 那么就删除这个handler

void mg_set_error_callback(struct mg_context *context, int error_code, mg_callback_t func, void *user_data)

注册一个错误处理函数. 比如 “404 Not Found”错误处理. 传递0作为 错误代码,将绑定到所有错误. 错误代码值 在 请求信息作为状态代码 被传递

void mg_set_log_callback(struct mg_context *context, mg_callback_t func)

指定一个函数来接收 所有的服务器的日志信息

void mg_set_ssl_password_callback(struct mg_context *ctx, mg_spcb_t func)

只在SSL许可请求密码时才需要.

void mg_modify_passwords_file(struct mg_context *ctx, const char *file_name, const char *user_name, const char *password)

添加,编辑或者删除 密码文件中的条目. 如果密码不为NULL, 条目将添加(已经存在就是修改)

如果password是NULL, 条目将删除. 返回1表示成功, 0表示错误

处理用户请求

int mg_write(struct mg_connection *, const void *buf, int len)

发送数据给客户. 返回值为 发送的字节个数. 如果发送的字节数< 请求的,或者为-1,表明发生了网络错误, 通常是 远程的客户端关闭了链接.

int mg_printf(struct mg_connection *, const char *fmt, …)

发送数据给客户端, 用printf()的semantics. 注意mg_printf 使用内部的缓冲区大小为

MAX_REQUEST_SIZE(16kb默认), 所以不要往里面打印大于 这个数目的数据. 否则,多出的数据会被截断. 函数的返回值是 发送的字节个数. Error sematics同mg_write()函数

const char *mg_get_header(const struct mg_connection *, const char *header_name)

给出特定的HTTP头部的值

char *mg_get_var(const struct mg_connection *, const char*var_name)

得到特定的表单变量的值. 注意: 这个函数(不像其他函数)会申请内存. 返回的值,必须自己主动用mg_free()释放. 如果这个变量既不再URI查询串,也不在POST数据中出现, 就返回NULL

char *mg_free(void *ptr)

释放 由 mg_get_var()申请的内存

void mg_authorize(struct mg_connection *)

设置authorize标志. 应该只在用mg_protect_uri()注册的回调函数中调用

通用辅助函数

const char *mg_version(void)

返回当前Mongoose version的版本

void mg_show_usage_string(FILE *)

显示 Mongoose 使用方法

命令行版本的使用

启动

mongoose option config_file

例如

mongoose -A htpasswd_file domain_name user_name password

不附接到任何终端, 使用当前的工作目录作为web的root目录,除非指定了-root选项

可以监听多个端口,比如80和443. 如果使用https, 则必须指定证书

如果使用-port选项指定SSL监听端口,那么必须在前面使用-ssl_cert选项指定证书

CGI脚本不需要放到一个特殊的目录, 可以放到任何目录. 通过文件扩展名来识别 CGI文件

SSI文件也可以识别.

mongoose也可以使用配置文件. 默认文件是 同目录下的”mongoose.conf”

配置文件,也可在命令行中的最后一个选项中指定

-A htpasswd_file domain_name user_name password

在密码文件中, 添加或者修改 用户密码

可以使用文本编辑器删除用户.

-access_log file

访问日志文件. 默认:如果不设置,没有日志文件

-acl (+|-)x.x.x.x/x,…

指定访问控制列表(access control list)

-admin_uri uri

设置管理页面. 在该页面,所有的选项在运行时改变. 这个URI可以使用密码保护起来.

-aliases list

-auth_PUT file

PUT或者DELETE的密码文件

-auth_gpass file

全局密码文件的位置

-auth_realm domain_name

-cgi_env list

传递环境变量给CGI脚本

以逗号分割,如 “VAR1=VAL1,VAR2=VAL2″

-cgi_ext list

逗号分割的CGI扩展名,所有的该后缀的文件被看作一个CGI脚本

默认:”cgi,pl,php”

-cgi_interp file

指定一个文件作为所有CGI脚本的I解释器. 默认这个值是不设置的. mongoose会在脚本文件的第1行去寻找合适的解释器

-dir_list yes|no

是否列出目录

-error_log file

-idle_time num_seconds

-max_threads number

-mime-types list

-ports port_list

逗号分割的端口的立标. 如果端口为SSL, 需要在端口后面添加s. 如 “-ports 80,443s”

也可以指定绑定的IP地址. “-ports 127.0.0.1:8080″

-protect list

-root directory

-ssi_ext list

-ssl_cert pem_file

-uid login

例子

mongoose -root /var/www -ssl_cert /etc/cert.pem -ports 8080,8043s

-aliases /aa=/tmp,/bb=/etc

Windows下安装Mongoose

安装器 将 Mongoose安装为一个windows服务,会在windows运行时自动启动

cgi_interp 必须是一个到脚本解释器的绝对路径 比如 C:/php/php-cgi.exe

为了让Mongoose工作,不一定要安装, mongoose.exe 就足够了. 安装过程没有复制任何DLL或者写注册表,它只是解压缩文件,注册了一个windows 服务.

Mongoose是以CGI解释器的形式运行PHP的, 这以为着每次为PHP服务时都必须载入 PHP解释器

复制 php5.dll 和 php-cgi.exe到 你的root目录,

如果你需要使用数据库,还需要复制php_sqlite3.dll

从PHP发行版的目录里的默认的php.ini文件中, 建立一个php.ini文件, 做如下更改

short_open_tag = On 这个用来支持短标记

max_execution_time = 15

max_input_time = 10

memory_limit = 16M

display_errors = on (调试时打开)

display_startup_erros = on (调试时打开)

log_errors = Off

html_erros = Off

magic_quotes_gpc = Off

extension_dir = “C:\root”

extension=php_sqlite3.dll (将DLL放入到 root目录)

data.timezone=US/Eastern (改变时区)

修改 mongoose.conf

cgi_interp php-cgi.exe

cgi_ext php
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: