基于Tinywebserver做了些许的修改
最开始的想法就是想要将Tinywebserver设置的固定页面访问改成可以通过访问数据库,获取想要显示的图片。
<form action="5" method="post">
<div align="center"><button type="submit">xxx.jpg</button></div>
</form>
//如果请求资源为/5,表示跳转pic
else if (*(p + 1) == '5')
{
char *m_url_real = (char *)malloc(sizeof(char) * 200);
strcpy(m_url_real, "/picture.html");
strncpy(m_real_file + len, m_url_real, strlen(m_url_real));
free(m_url_real);
}
通过阅读源码,发现有关连接HTML的部分都是写在http_con.cpp中的,Tinywebserver中给定了一个按钮,去跳转显示图片的网页,提交的形式为post,设置了一个标记为5,由此将标记5传递到http_conn.cpp中,*(p+1)=5,在根目录下加入了想要跳转的页面picture.html。
但是这个地方是固定的,怎么将访问数据库得到的图片或者说图片地址传递过去呢?
单纯的修改URL,在后面加入变量是不行的,会产生NO_RESOURCE的错误。
<div align="center"><img src="./xxx.jpg" title="awsl"/></div>
//在HTTP报文中,请求行用来说明请求类型
//要访问的资源以及所使用的HTTP版本,其中各个部分之间通过\t或空格分隔。
//请求行中最先含有空格和\t任一字符的位置并返回
//strpbrk在源字符串(s1)中找出最先含有搜索字符串(s2)
//中任一字符的位置并返回,若找不到则返回空指针
m_url = strpbrk(text, " \t");
//如果没有空格或\t,则报文格式有误
if (!m_url)
{
return BAD_REQUEST;
}
//将该位置改为\0,用于将前面数据取出
//(已读取的数据不再会匹配到\t)
*m_url++ = '\0';
//取出数据,并通过与GET和POST比较,以确定请求方式
char *method = text;
if (strcasecmp(method, "GET") == 0)
m_method = GET;
else if (strcasecmp(method, "POST") == 0)
{
m_method = POST;
cgi = 1;
}
else
return BAD_REQUEST;
//m_url此时跳过了第一个空格或\t字符,但不知道之后是否还有
//将m_url向后偏移,通过查找
//继续跳过空格和\t字符,指向请求资源的第一个字符
//strspn:检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标
//即跳过匹配的字符串片段
m_url += strspn(m_url, " \t");
//相同逻辑,判断HTTP版本号
m_version = strpbrk(m_url, " \t");
if (!m_version)
return BAD_REQUEST;
*m_version++ = '\0';
m_version += strspn(m_version, " \t");
//仅支持HTTP/1.1
if (strcasecmp(m_version, "HTTP/1.1") != 0)
return BAD_REQUEST;
//对请求资源前7个字符进行判断
//这里主要是有些报文的请求资源中会带有http://
//这里需要对这种情况进行单独处理
if (strncasecmp(m_url, "http://", 7) == 0)
{
m_url += 7;
m_url = strchr(m_url, '/');
}
//同样增加https情况
if (strncasecmp(m_url, "https://", 8) == 0)
{
m_url += 8;
m_url = strchr(m_url, '/');
}
else
//如果以上均不符合,即不是登录和注册,直接将url与网站目录拼接
//这里的情况是welcome界面,请求服务器上的一个图片
strncpy(m_real_file + len, m_url, FILENAME_LEN - len - 1);
实验发现,http_conn.cpp中的do_request()方法会访问两次,第一次将路径修改为需要访问的picture.html,第二次会将picture.html这部分替换成xxx.jpg这部分。
那么他是怎么做的呢?
首先他以get形式获取text字符串,大概的形式为:GET ./xxx.jpg HTTP/1.1
然后一步步解析协议和请求方式等等,最终提取出/xxx.jpg,并在do_request()的else中将xxx.jpg拼接上,那么我首先将picture.html中的图片位置设置成一个标记,比如/mysql,然后我在m_url解析结束后,判断是否和我标记的/mysql相等,如果相等,那么我将m_url改为我想要访问数据库,得到的图片地址,就能够将我自己指定的图片发过去,当然,前提是你本地要将数据库中存储的图片进行下载。
//同样增加https情况
if (strncasecmp(m_url, "https://", 8) == 0)
{
m_url += 8;
m_url = strchr(m_url, '/');
}
if(strcmp(m_url, "/mysql") == 0) {
m_url = "/2.png";//此处即可通过调用数据库获取指定的图片地址,然后将字符串赋值即可。
}