web(六)---fastcgi再进阶(请求和响应)

接上节, 上节只有响应---cout,  本节获取地址栏的QUERY_STRING, 然后响应.

一. req_resp.cpp.

#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "fcgio.h"
#include "fcgi_config.h"

using namespace std;

int main (void)
{
    int count = 0;
    long pid = getpid();

    streambuf * cin_streambuf  = cin.rdbuf();
    streambuf * cout_streambuf = cout.rdbuf();
    streambuf * cerr_streambuf = cerr.rdbuf();

    FCGX_Request request;

    FCGX_Init();
    FCGX_InitRequest(&request, 0, 0);

    while (FCGX_Accept_r(&request) == 0)
    {
        fcgi_streambuf cin_fcgi_streambuf(request.in);
        fcgi_streambuf cout_fcgi_streambuf(request.out);
        fcgi_streambuf cerr_fcgi_streambuf(request.err);

        cin.rdbuf(&cin_fcgi_streambuf);
        cout.rdbuf(&cout_fcgi_streambuf);
        cerr.rdbuf(&cerr_fcgi_streambuf);

        cout << "Content-type: text/html\r\n"
                "\r\n"
                "<H4>PID: " << pid << "</H4>\n"
                "<H4>Request Number: " << ++count << "</H4>\n";

        cout << "<H4>Request Environment</H4>\n";
        for(int i = 0; request.envp[i]; ++i)
        {
            char* findQueryStr = NULL;
            findQueryStr = strstr(request.envp[i], "QUERY_STRING");
            if (findQueryStr)
            {
                cout << request.envp[i] << ‘\n‘;
            }
        }
    }

    cin.rdbuf(cin_streambuf);
    cout.rdbuf(cout_streambuf);
    cerr.rdbuf(cerr_streambuf);

    return 0;
}

二. 编译运行.

#g++ -o req_resp req_resp.cpp -I /usr/local/include -L /usr/local/lib -lfcgi -lstdc++ -lfcgi++

#./req_resp

若编译或运行时出错(一般是库问题), 参考上几节解决办法.

三. 将cgi拷贝到ngix(目标路径没有则手动创建)

cp ***/req_resp  /usr/local/nginx/cgibin

四. 启动Spawn-fcgi.

/usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 8088 -f /usr/local/nginx/cgibin/req_resp

五. 访问.

注: python index.py已经运行的情况下.

浏览器地址栏:    localhost/req_resp.cgi?his_is_from_brower_input&hello=1&world=2

注意显示的QUERY_STRING就是地址栏问号后的内容.

浏览器显示为:

PID: 4072

Request Number: 2

Request Environment

QUERY_STRING=this_is_from_brower_input&hello=1&world=2

时间: 2024-12-21 21:58:32

web(六)---fastcgi再进阶(请求和响应)的相关文章

web(七)---fastcgi再进阶(请求和响应)官方例子

在fast-cgi源码的examples文件夹下有很多例子, 下面给出echo例子, 编译运行方法同上几节. fast-cgi的API  google之. http://fossies.org/dox/fcgi-2.4.0/fcgiapp_8h.html#a32f6950798054a70404ce24c22ea28b9 echo-cpp.cpp #include <stdlib.h> #ifdef _WIN32 #include <process.h> #else #includ

web(六)---fastcgi进阶(请求和响应)

接上几节, 本节写有请求和响应的demo. 一. myecho.cpp如下: #include <stdlib.h> #include <unistd.h> #include "fcgio.h" #include "fcgi_config.h" using namespace std; int main (void) { int count = 0; long pid = getpid(); streambuf * cin_streambuf

JSP内置对象——九大内置对象简介与四种作用域范围以及Web程序的请求和响应模式

最近在学习JSP相关基础知识,我们都知道JSP当中存在一组不使用new关键字就可以在脚本和表达式中使用的对象,在Web开发中经常使用.为了能更好的理解这些对象,在此对JSP内置对象作一些归纳. 目录: JSP内置对象——九大内置对象简介与四种作用域范围以及Web程序的请求和响应模式 JSP内置对象——out(待更新) JSP内置对象——request/response(待更新) JSP内置对象——session(待更新) JSP内置对象——application(待更新) JSP内置对象——其他

Play Framework Web开发教程(16): 处理HTTP请求和响应

设计应用的一个方面是规划HTTP请求的URL规范,超链接,HTTP表单以及可能的公用API接口.在Play这是通过路由配置,然后在控制器中实现相应的接口.Play应用中的路由配置可以Controller类构成了MVC框架中的控制层,如下图所示:在Play应用中Controller为定义了HTTP接口的Scala类,而你的路由配置决定了给定的HTTP请求调用哪个Controller中定义的方法,这些Controller中的方法称为Action(动作),因此Play 的MVC框架也称为基于"动作&q

你知道web项目中Http请求与响应的四种情况吗

[四种情况]: HttpRequest.HttpResponse.HttpServletRequest.HttpServletResponse[什么是HTTP?]超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议.HTTP在客户端和服务器之间以request-response protocol(请求-回复协议)工作.[Http常用的两个方法]get - 从指定的服务器中获取数据post - 提交数据给指定的服务器

初入网络系列笔记(4)HTTP请求和响应

一.借鉴说明,本博文借鉴以下博文 1.starok,HTTP必知必会,http://www.cnblogs.com/starstone/p/4890409.html 2.CareySon,HTTP协议漫谈,http://www.cnblogs.com/CareySon/archive/2012/04/27/HTTP-Protocol.html 3.逖靖寒,浅析HTTP协议,http://www.cnblogs.com/gpcuster/archive/2009/05/25/1488749.htm

Web安全测试之跨站请求伪造(CSRF)篇

跨站请求伪造(即CSRF)被Web安全界称为诸多漏洞中“沉睡的巨人”,其威胁程度由此“美誉”便可见一斑.本文将简单介绍该漏洞,并详细说明造成这种漏洞的原因所在,以及针对该漏洞的黑盒测试与灰盒子测试具体方法和示例,最后提提了一些防范该攻击的建议,希望本文对读者的安全测试能够有所启发. 一.CSRF概述 我们首先来了解一下什么是跨站请求伪造(CSRF)?跨站请求伪造是一种挟制终端用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法.攻击者只要借助少许的社会工程诡计,例如通过电子邮件或者是聊天

J2EE请求与响应—Servlet

一.什么是Servlet? Servlet是运行Web服务器上的一个特殊Java类,其特殊用途是响应客户端请求并做出处理,使得客户端与服务器端进行交互. 二.生命周期  Servlet生命周期是通过Web容器控制,主要分为以下几个阶段: 创建servlet的实例 初始化阶段,调用init()方法 响应请求,调用service()方法 销毁实例,调用destroy()方法 实例垃圾回收,调用finalize()方法  三.Servlet中几个重要的方法: 在Servlet生命周期中,servlet

一次请求到响应的整个流程

一次请求到响应的整个流程 As we all know,所有的Web应用,其本质上其实就是一个socket服务端,而用户的浏览器就是一个socket客户端. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/usr/bin/env python #coding:utf-8     import socket     def handle_request(client):     buf = client.recv(1024)