def startService(self): Service.startService(self) log.msg('Service starting. servers=%r, job queue=%s, base urls=%r' % (self.gearmand_servers, self.job_queue, self.base_urls)) log.verbose('Verbose logging is enabled') for server in self.gearmand_servers: host, port = server.split(':') f = CurlerClientFactory(self, server, self.base_urls, self.job_queue, self.num_workers) proto = yield reactor.connectTCP(host, int(port), f)
def handle_job(self, job): time_start = time() try: log.msg('Got job: %s' % job.handle) log.verbose('data=%r' % job.data) response = yield self._make_request(job.handle, job.data) except Exception, e: log.msg('ERROR: Unhandled exception: %r' % e) # Log full traceback on multiple lines for line in traceback.format_exc().split('\n'): log.msg(line) response = {"error": "Internal curler error. Check the logs."}
# make sure it contains data if 'data' not in job_data: defer.returnValue( {"error": "Missing \"data\" property in job data"}) headers = self.build_headers(job_data) # we'll post the data as JSON, so convert it back data = json.dumps(job_data['data']) # select random base URL to hit path = random.choice(self.base_urls) url = str("%s/%s" % (path, job_data['method'])) try: log.verbose('POSTing to %s, data=%r' % (url, data)) postdata = urllib.urlencode({"job_handle": handle, "data": data}) try: # despite our name, we're not actually using curl :) response = yield getPage(url, method='POST', postdata=postdata, headers=headers) status = 200 except Error, e: status = int(e.status) response = e.response log.verbose('POST complete: status=%d, response=%r' % (status, response)) defer.returnValue({
# allow header customization if 'headers' not in job_data: headers = {'Content-Type': 'application/x-www-form-urlencoded'} else: headers = job_data['headers'] # we'll post the data as JSON, so convert it back data = json.dumps(job_data['data']) # select random base URL to hit path = random.choice(self.base_urls) url = str("%s/%s" % (path, job_data['method'])) try: log.verbose('POSTing to %s, data=%r' % (url, data)) postdata = urllib.urlencode({ "job_handle": handle, "data": data}) try: # despite our name, we're not actually using curl :) response = yield getPage(url, method='POST', postdata=postdata, headers=headers) status = 200 except Error, e: status = int(e.status) response = e.response log.verbose('POST complete: status=%d, response=%r' % (status, response)) defer.returnValue({'url': url, 'status': status,