这次,来详细看看lib/target.rb的源代码。target.rb中定义了一个Target类,这个类主要是对目标url进行处理,涉及到url的提交方式,如get、put、post等,还涉及到是采用http还是https,以及对各部分结果的处理。
接下来,按照调试运行函数跟进的顺序,一个一个进行分析。跟进whatweb主程序:
首先,是对Target类的初始化,跟进去看看initialize的实现细节:
这里判断target是不是url,是不是原始包保存的file,并且赋值相关变量。如果是url涉及到对url进行解析,判断url的路径。初始化完成之后接着向下执行进入的是target.open这个函数,跟进去看看。
判断是不是一个文件。在这里我提供的是一个url,所以这里的判断会跳到open_url函数处理的分支。直接进入open_url这个函数,跟进去看看。
判断是否使用了代理,如果有使用代理,则先要设置代理服务器,然后再初始化指定的主机和端口。
接着设置打开的超时时间和读出的超时时间,紧接着有一个https的判断语句。继续往下:
如果是https会有相关的设置。我这里是没有https设置,跳过继续往下就是根据query部分对url进行拼接。继续往下就是判断提交的方式,如GET,HEAD,POST。再下面就是一个认证,如果全局判断$BASIC_AUTH_USER为真,则会调用basic_auth函数进行认证操作。继续往下看:
继续往下就是根据返回结果进行分组赋值了。涉及到header、body、status、以及IP地址的转换。跳出open_url继续open中代码的执行。判断返回的body是否为空来进行部分设置。
返回到whatweb主程序继续执行,这里有一个判断返回状态码,根据状态码判断是否重复前面执行步骤。
进入get_redirection_target看看:
这里会根据返回的状态码,赋值新的url地址。看下面这段代码:
HTML meta refresh是刷新与跳转(重定向)页面。注意:scan操作是查找全部匹配的内容。如果正则表达是中带有(),则只记录()的匹配内容。223行的代码相当于取得跳转的url地址,下面代码片段也是取得跳转url地址。后续会根据这两种方式获取的url地址对跳转地址进行赋值。
上面就是根据调试运行流程,梳理的target.rb中代码执行顺序。其中,还涉及到file的处理。file其实就是response那个原始包,保存成一个文件进行处理。open_file函数对file的处理也是按照response各分组进行处理的。