简单的http服务器源码

/*
简单的http服务器,参考《深入理解计算机系统》
运行后在浏览器输入http://127.0.0.1/1.htm
*/

import "rsock.h"
import "rfile.h"
import "rdir.h"

main
{
	rsock svr
	rsock client
	
	svr.listen 80
	for svr.accept client
	{
		rstr s
		s.m_buf.alloc 65536
		s.m_buf.m_count=client.recv s.count,s.begin	
		proc client,s
		client.close
	}
}

class http_item
{
	rstr name
	rstr cont
}

proc(rsock& client,rstr& s)
{
	s.print
	vstr=s.split('\r\n')
	rbuf<http_item> vitem
	for i in vstr
	{
		pos=vstr[i].find ' '
		http_item item
		item.name=vstr[i].sub(0,pos)
		item.cont=vstr[i].sub(pos+1)
		vitem+=item
	}
	proc client,vitem
}

proc(rsock& client,rbuf<http_item>& v)
{
	if(v.empty||v.get(0).name!='GET')
		return
	path=v[0].cont.sub(0,v[0].cont.find(' '))
	path='.'+path
	rfile file(path)
	ifn(file.read_all)
		return
	s='HTTP/1.1 200 OK\r\n'
	s+='Server: R++ Web Server\r\n'
	s+='Content-Length: '+rstr(file.size)+'\r\n'
	s+='Content-type: '+get_type(path)+'\r\n\r\n'
	s+=file.m_str
	client.send(s.count,s.begin)
}

rstr get_type(rstr name)
{
	name=rdir.get_suffix(rdir.get_name(name))
	if(name=='htm'||name=='html')
		return 'text/html'
	elif(name=='gif')
		return 'image/gif'
	elif(name=='jpg')
		return 'image/jpg'
	else
		return 'text/plain'
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值