11#!/usr/bin/env python
22
3- import os , sys , re , datetime , argparse , traceback , tempfile
3+ import os , sys , re , datetime , argparse , traceback , tempfile , json
44
55# args
66parser = argparse .ArgumentParser (
@@ -14,6 +14,7 @@ parser.add_argument('--urls', '-u', dest='url_file',
1414parser .add_argument ('--slow' , dest = 'slow_threshold' , type = float , default = 1.0 ,
1515 help = 'responses taking longer than this (in seconds) results in SLOW being printed' )
1616parser .add_argument ('--settings' , dest = 'settings' , help = 'custom settings file' )
17+ parser .add_argument ('--logfile' , dest = 'logfile' , help = 'write to logfile' )
1718
1819args = parser .parse_args ()
1920
@@ -51,6 +52,7 @@ if args.url_file:
5152
5253if not initial_urls :
5354 initial_urls .append ("/" )
55+ initial_urls .append ("/api/v1" )
5456
5557visited = set ()
5658urls = {} # url -> referrer
@@ -78,8 +80,30 @@ def extract_html_urls(content):
7880
7981 yield url
8082
83+ def extract_tastypie_urls (content ):
84+ VISIT_OBJECTS = False
85+ VISIT_NEXT = False
86+ data = json .loads (content )
87+ for item in data :
88+ if type (data [item ]) is dict :
89+ if "list_endpoint" in data [item ]:
90+ uri = data [item ]["list_endpoint" ]
91+ yield uri
92+ if VISIT_NEXT :
93+ if "meta" in data and "next" in data ["meta" ]:
94+ uri = data ["meta" ]["next" ]
95+ if uri != None :
96+ yield uri
97+ if VISIT_OBJECTS :
98+ if "objects" in data :
99+ object_list = data ["objects" ]
100+ for i in range (len (object_list )):
101+ if "resource_uri" in object_list [i ]:
102+ uri = object_list [i ]["resource_uri" ]
103+ yield uri
104+
81105django .setup ()
82- client = django .test .Client ()
106+ client = django .test .Client (Accept = 'text/html,text/plain,application/json' )
83107
84108for url in initial_urls :
85109 urls [url ] = "[initial]"
@@ -88,14 +112,16 @@ errors = 0
88112count = 0
89113
90114start_time = datetime .datetime .now ()
91- fh , fn = tempfile .mkstemp (prefix = "test-crawl-" , suffix = ".log" , dir = "../" )
92- logfile = open (fn , "w" )
93- os .close (fh )
115+
116+ logfile = None
117+ if args .logfile :
118+ logfile = open (args .logfile , "w" )
94119
95120def log (s ):
96121 print (s )
97- logfile .write (s )
98- logfile .write ('\n ' )
122+ if logfile :
123+ logfile .write (s )
124+ logfile .write ('\n ' )
99125
100126def get_referrers (url ):
101127 ref_list = []
@@ -150,8 +176,19 @@ while urls:
150176 log ("=============" )
151177 log (traceback .format_exc ())
152178 log ("=============" )
179+ elif ctype == "application/json" :
180+ try :
181+ for u in extract_tastypie_urls (r .content ):
182+ if u not in visited and u not in urls :
183+ urls [u ] = url
184+ referrers [u ] = url
185+ except :
186+ log ("error extracting urls from %s" % url )
187+ log ("=============" )
188+ log (traceback .format_exc ())
189+ log ("=============" )
153190 else :
154- tags .append (u"FAIL (from %s)" % referrer )
191+ tags .append (u"FAIL for %s \n (from %s)" % ( url , referrer ) )
155192 errors += 1
156193
157194 if elapsed .total_seconds () > slow_threshold :
@@ -164,12 +201,13 @@ while urls:
164201 sec = acc_secs % 60
165202
166203 if (len (visited ) % 100 ) == 1 :
167- log ("\n Elapsed Visited Queue Code Time Url ... Notes" )
204+ log ("\n Elapsed Visited Queue Code Time Url ... Notes" )
168205
169- log ("%2d:%02d:%02d %7d %6d %s %.3fs %s %s" % (hrs ,min ,sec , len (visited ), len (urls ), r .status_code , elapsed .total_seconds (), url , " " .join (tags )))
206+ log ("%2d:%02d:%02d %7d %6d %s %6 .3fs %s %s" % (hrs ,min ,sec , len (visited ), len (urls ), r .status_code , elapsed .total_seconds (), url , " " .join (tags )))
170207
171- logfile .close ()
172- sys .stderr .write ("Output written to %s\n \n " % logfile .name )
208+ if logfile :
209+ logfile .close ()
210+ sys .stderr .write ("Output written to %s\n \n " % logfile .name )
173211
174212if errors > 0 :
175213 sys .stderr .write ("Found %s errors, grep output for FAIL for details\n " % errors )
0 commit comments