JDK自带HttpServer处理Http请求
下面是JDK自带的HttpServer处理Http请求的源码和流程,我看网上貌似还没有介绍这个的流程,所有就画了一下,如有不足,请矫正。
1、官方API
2、启动一个HttpServer demo:
|
Context 可以创建多个,核心思想:HttpServer将path和Handler处理器封装成 HttpContextImpl 对象,然后复制给ServerImpl的属性contexts, 其实就是一个链表;
|
HttpServer处理Http请求的流程
流程图如下:
1、创建线程,从线程池中获取空闲的线程,如果没有则创建,等线程池那一套, task.run();
2、ServerImpl的一个内部类Exchange实现了Runnable接口,在run方法里面执行部分逻辑;Exchange有一下几个重要的属性:
|
大致逻辑如下
1、首先获取上下文对象,判断上下文是否为空,如果context不是空,则初始化 rawin和rawout,从connection对象的输入输出流中获取;
2、如果上下文是空的,则在SocketChannel中获取数据,初始化rawin和rawout;
3、根据获取的rawin和rawout创建一个Request对象,去判断Request对象的requestLine是否为空,如果是空的,则关闭当前链接,直接返回;
4、如果requestLine不是空,则去校验requestLine的合法性,如果requestList不合法,直接抛400异常Bad request line;
5、如果请求是合法的,然后根据请求的uri中的path,寻找是否存在context,参数是 this.protocol, var10.getPath(),如果没有找到path,则抛404异常,核心代码如下:
|
6、找到HttpContextImpl对象之后,还要校验context是否设置了handler,如果没有配置handler,则抛500错误;
|
7、然后设置请求的Header和Parameters,初始化ExchangeImpl对象;
8、之后构造Chain对象,执行doFilter方法,doFilter方法的核心就是调用响应的handler方法的逻辑,核心代码如下:
|
9、如果调用hander方法发生异常时,则调用reject方法,reject方法主要操作氛围两部分,第一是打印错误日志,第二是关闭当前连接,关闭当前连接的操作实质是将存放HttpConnection的Set中remove当前连接对象。