乐于分享
好东西不私藏

Tinyhttpd源码解析(4)

Tinyhttpd源码解析(4)

一、HTTP协议简介

HTTP(超文本传输协议)的请求和响应格式其实 非常简单、本质就是基于TCP协议的结构化文本协议

一次HTTP协议的通信过程为:

Client –> HTTP Request  –>Server 

Server –> HTTP Response –>Client

Client发送请求到HTTP服务器,HTTP服务器将请求结果返回给Client。

1.1 HTTP Request

HTTP请求由四部分构成,手动解析HTTP请求时,只要先解析请求行,再解析请求头部,遇到空行则解析头部完成,根据content-length和method来判断是否需要解析请求体。

请求行请求头空行请求体(可选)

1.1.1 请求行

格式:METHOD <space> URL <space> VERSION例如:------------------------------------GET /index.html HTTP/1.1------------------------------------常见Method如下:    GET     获取资源     POST    提交数据     PUT     更新         DELETE  删除     

1.1.2 请求头

格式为键值对:Key:Value例如:----------------------------------Host: example.comUser-Agent: Chrome/120Accept: text/htmlConnection: keep-aliveConten-length:请求体长度-----------------------------------

1.1.3 空行(非常重要)

空行:------------------------------------\r\n------------------------------------在解析HTTP请求头部时,遇到空行表示解析头部结束。

1.1.4 请求体(body,可选)

例如:一个post的HTTP请求,Body内容格式由content-type指定,Body长度由content-length指定。------------------------------------POST /login HTTP/1.1Host: example.comContent-Type: application/jsonContent-Length: 18{"user":"tom"}------------------------------------

1.2 HTTP Response

响应结构与请求结构完全对称

状态行响应头空行响应体

1.2.1 状态行

格式:VERSION <space> STATUS_CODE <space> REASON例如:------------------------------------HTTP/1.1 200 OK------------------------------------常见状态码:    200	成功    301	重定向    400	请求错误    401	未授权    404	未找到    500	服务器错误

1.2.2 响应头

格式为键值对:Key:Value例如:------------------------------------Content-Type: text/htmlContent-Length: 1256Server: nginx------------------------------------

1.2.3 空行

空行:------------------------------------\r\n------------------------------------

1.2.4响应体

------------------------------------<html><body>Hello</body></html>------------------------------------也可能是:JSON、图片、视频、二进制。

二、 源码解析

2.1 函数接口概览

/*=================辅助函数====================*//*HTTP Response响应辅助函数,提前封装好四个状态码的响应函数。根据上面讨论HTTP Response格式封装了500、400、404、501四个状态码的响应体的构造函数。不重要,仅仅是为了拿来即用。*/voidcannotExecute(int client);voidbadRequest(int client);voidnotFound(int client);voidunimplemented(int client);/*当HTTP request请求的内容是一个文件时,通过下面的三个辅助函数,可以便捷的生成HTTP响应头部,然后根据文件名读取HTTP服务器上的文件返回给client.*/voidheaders(int client,constchar* filename);voidcat(int client,FILE *resource);voidserveFile(int client,char * filename);/* 读取一行数据然后返回,遇到\n表示读取一行数据结束。*/intgetLine(int sock,char *buf,size_t size);/*=================辅助函数====================*//*=====================核心函数==================*//* 通过exec程序启动CGI子进程,通过环境变量跨进程传递传递HTTP请求消息, 利用管道来实现父子进程间文件数据的传输,将CGI子进程生成的HTML 数据传递给HTTP服务器父进程,发送给客户端。*/voidexecuteCgi(int client,constchar *path,constchar *method,constchar *query_string);/*处理client连接的线程函数体,负责解析HTTP协议报文。仅仅处理GET和POST两个方法的请求。功能: 1、通过GET方法可以请求到索引页面。 2、通过索引页面的表单可以通过POST方法发送HTTP request修改页面的背景色。解析到请求的方法时POST方法后,会调用executeCgi接口,通过CGI程序生成特定背景色的HTML文本。*/void *  acceptRequest(void *arg);//利用socket接口,创建并启动TCP服务器intstartup(uint16_t* port);//程序入口,接收client连接,开启子线程处理新连接。intmain(int argc,char** argv)/*=====================核心函数==================*/
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » Tinyhttpd源码解析(4)

评论 抢沙发

7 + 7 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮