koa是如何解析url的

查看源码 其内部使用了一个库

const parse = require('parseurl');

parseurl的源码

function parseurl (req) {
  var url = req.url
// -->先判断是不是undefined
  if (url === undefined) {
    // URL is undefined
    return undefined
  }
  
// 判断这个url是不是被解析过了
  var parsed = req._parsedUrl
  if (fresh(url, parsed)) {
    // Return cached URL parse
    return parsed
  }

  // Parse the URL 解析url
  parsed = fastparse(url)
  parsed._raw = url

  return (req._parsedUrl = parsed)
};

fastparse的代码

看fastparse的代码之前先看下parse (新版的node不使用这种用法)

var url = require('url');
var parse = url.parse;
let a = 'https://user:pass@sub.host.com:8080/p/a/t/h?query=string#hash';
console.log(parse(a))
//Url 这个函数解析之后得到的内容
{
  protocol: 'https:',
  slashes: true,
  auth: 'user:pass',
  host: 'sub.host.com:8080',
  port: '8080',
  hostname: 'sub.host.com',
  hash: '#hash',
  search: '?query=string',
  query: 'query=string',
  pathname: '/p/a/t/h',
  path: '/p/a/t/h?query=string',
  href: 'https://user:pass@sub.host.com:8080/p/a/t/h?query=string#hash'
}
function fastparse (str) {
    //如果不是个字符串或者不是/开头 直接使用parse(str)
  if (typeof str !== 'string' || str.charCodeAt(0) !== 0x2f /* / */) {
    return parse(str)
  }

  var pathname = str
  var query = null
  var search = null

  // This takes the regexp from https://github.com/joyent/node/pull/7878
  // Which is /^(\/[^?#\s]*)(\?[^#\s]*)?$/
  // And unrolls it into a for loop
  //遍历每一个字符
  for (var i = 1; i < str.length; i++) {
    switch (str.charCodeAt(i)) {
      case 0x3f: /* ?  */
        if (search === null) {  //只处理一次
          pathname = str.substring(0, i)
          query = str.substring(i + 1)
          search = str.substring(i)
        }
        break
        //下面这些直接返回parse(str)
      case 0x09: /* \t */
      case 0x0a: /* \n */
      case 0x0c: /* \f */
      case 0x0d: /* \r */
      case 0x20: /*    */
      case 0x23: /* #  */
      case 0xa0:
      case 0xfeff:
        return parse(str)
    }
  }
    
  //如果没有上述情况的发生 就把解析到的内容赋值到Url类中  
  var url = Url !== undefined
    ? new Url()
    : {}

  url.path = str
  url.href = str
  url.pathname = pathname

  if (search !== null) {
    url.query = query
    url.search = search
  }

  return url
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值