如果是文件
if(S_ISREG(st.st_mode)){
sprintf(buf+strlen(buf),
"<tr><td><a href=\"%s\">%s</a></td><td>%ld</td></tr>",
enstr, name, (long)st.st_size);
}
// 如果是目录
else if(S_ISDIR(st.st_mode)){
sprintf(buf+strlen(buf),
"<tr><td><a href=\"%s/\">%s/</a></td><td>%ld</td></tr>",
enstr, name, (long)st.st_size);
}
bufferevent_write(bev, buf, strlen(buf));
memset(buf, 0, sizeof(buf));
}
sprintf(buf+strlen(buf), "</table></body></html>");
bufferevent_write(bev, buf, strlen(buf));
closedir(dir);
#endif
}
void http_get_request(const char* line, struct bufferevent* bev){
char method[12] = {0};
char res[1024] = {0};
sscanf(line, "%[^ ] %[^ ]", method, res);
// 转码 将不能识别的中文乱码 - > 中文
// 解码 %23 %34 %5f
char destr[1024];
decode_str(destr, res);
// 处理path /xx
// 去掉path中的/
char* file = destr + 1;
char fbuf[1024];
if(strcmp(res, "/") == 0){
file = "./";
//getcwd(fbuf, sizeof(fbuf));
//printf("root:[%s]\n", fbuf);
// file = fbuf;
}
struct stat st;
printf("file:[%s]\n", file);
int ret = stat(file, &st);
if(ret == -1){
//todo 404
perror("stat error");
exit(1);
}
if(S_ISDIR(st.st_mode)){
//dir
// 发送头信息
send_respond_head(bev, 200, "OK", get_file_type(".html"), 100000);
send_dir(bev, file);
}
else if(S_ISREG(st.st_mode)){
//reg file
send_respond_head(bev, 200, "OK", get_file_type(file), st.st_size);
send_file(bev, file);
}
}
void readcb (struct bufferevent* bev,void* ctx){
struct evbuffer* evbuf = bufferevent_get_input(bev);
char* line;
size_t len;
line = evbuffer_readln(evbuf, &len, EVBUFFER_EOL_CRLF);
/*
char* tmp = line;
while(1){
tmp = evbuffer_readln(evbuf, &len, EVBUFFER_EOL_CRLF);
if(tmp) break;
printf("%s\n", tmp);
}
printf("line:[%s]", line);
*/
if(strncasecmp("get", line, 3) == 0){
http_get_request(line, bev);
//disconnect(bev);
}
}
void writecb (struct bufferevent* bev,void* ctx){
}
void eventcb (struct bufferevent* bev,short what,void* ctx){
}
c/c++ 学习互助QQ群:877684253 本人微信:xiaoshitou5854
|