Ejemplo n.º 1
0
    def get(self):

        # validate the request parameters
        devStoreKey = validateRequest(self.request, api_utils.GETROUTES)
        if devStoreKey is None:
            logging.debug("unable to validate the request parameters")
            self.response.headers['Content-Type'] = 'application/javascript'
            self.response.out.write(
                json.dumps(
                    api_utils.buildErrorResponse(
                        '-1', 'Illegal request parameters')))
            return

        logging.debug('getroutes request...  ')
        if self.request.get('force') is not '':
            refresh = True
        else:
            refresh = False

        if api_utils.afterHours() is True:
            # don't run these jobs during "off" hours
            json_response = api_utils.buildErrorResponse(
                '-1', 'The Metro service is not currently running')
        else:
            if refresh is True:
                json_response = getRoutes(refresh)

                # drop it into the memcache again
                memcache.set(api_utils.GETROUTES, json_response)
                logging.debug('---> storing in memcache')
            else:
                logging.debug('---> memcache hit')
                json_response = memcache.get(api_utils.GETROUTES)
                if json_response is None:
                    json_response = getRoutes(refresh)

                    # drop it into the memcache again
                    memcache.set(api_utils.GETROUTES, json_response)
                    logging.debug('---> storing in memcache')

            # record the API call for this devkey
            api_utils.recordDeveloperRequest(devStoreKey, api_utils.GETROUTES,
                                             self.request.query_string,
                                             self.request.remote_addr)

        #logging.debug('API: json response %s' % json_response);
        callback = self.request.get('callback')
        if callback is not '':
            self.response.headers['Content-Type'] = 'application/javascript'
            self.response.headers['Access-Control-Allow-Origin'] = '*'
            self.response.headers['Access-Control-Allow-Methods'] = 'GET'
            response = callback + '(' + json.dumps(json_response) + ');'
        else:
            self.response.headers['Content-Type'] = 'application/json'
            response = json_response

        self.response.out.write(response)
        stathat.apiStatCount()
Ejemplo n.º 2
0
    def get(self):

        # validate the request parameters
        devStoreKey = validateRequest(self.request, api_utils.GETSTOPLOCATION)
        if devStoreKey is None:
            logging.debug("unable to validate the request parameters")
            self.response.headers['Content-Type'] = 'application/javascript'
            self.response.out.write(
                json.dumps(
                    api_utils.buildErrorResponse(
                        '-1', 'Illegal request parameters')))
            return

        # snare the inputs
        stopID = api_utils.conformStopID(self.request.get('stopID'))
        logging.debug('getstoplocation request parameters...  stopID %s' %
                      stopID)

        if api_utils.afterHours() is True:
            # don't run these jobs during "off" hours
            json_response = api_utils.buildErrorResponse(
                '-1', 'The Metro service is not currently running')
        elif stopID is not '':
            json_response = stopLocationRequest(stopID)
            api_utils.recordDeveloperRequest(devStoreKey, api_utils.GETSTOPS,
                                             self.request.query_string,
                                             self.request.remote_addr)
        else:
            logging.error("API: invalid request")
            json_response = api_utils.buildErrorResponse(
                '-1',
                'Invalid Request parameters. Did you forget to include a stpID?'
            )
            api_utils.recordDeveloperRequest(
                devStoreKey, api_utils.GETSTOPS, self.request.query_string,
                self.request.remote_addr, 'illegal query string combination')

        #logging.debug('API: json response %s' % json_response);
        # encapsulate response in json
        callback = self.request.get('callback')
        if callback is not '':
            self.response.headers['Content-Type'] = 'application/javascript'
            self.response.headers['Access-Control-Allow-Origin'] = '*'
            self.response.headers['Access-Control-Allow-Methods'] = 'GET'
            response = callback + '(' + json.dumps(json_response) + ');'
        else:
            self.response.headers['Content-Type'] = 'application/json'
            response = json.dumps(json_response)

        self.response.out.write(response)
        stathat.apiStatCount()
        # push event out to anyone watching the live board
        task = Task(url='/map/task', params={'stopID': stopID})
        task.add('eventlogger')
Ejemplo n.º 3
0
    def get(self):

      # validate the request parameters
      devStoreKey = validateRequest(self.request,api_utils.GETROUTES)
      if devStoreKey is None:
          logging.debug("unable to validate the request parameters")
          self.response.headers['Content-Type'] = 'application/javascript'
          self.response.out.write(json.dumps(api_utils.buildErrorResponse('-1','Illegal request parameters')))
          return

      logging.debug('getroutes request...  ')
      if self.request.get('force') is not '':
          refresh = True
      else:
          refresh = False

      if api_utils.afterHours() is True:
          # don't run these jobs during "off" hours
	      json_response = api_utils.buildErrorResponse('-1','The Metro service is not currently running')
      else:
          if refresh is True:
              json_response = getRoutes(refresh)

              # drop it into the memcache again
              memcache.set(api_utils.GETROUTES, json_response)
              logging.debug('---> storing in memcache');
          else:
              logging.debug('---> memcache hit');
              json_response = memcache.get(api_utils.GETROUTES)
              if json_response is None:
                  json_response = getRoutes(refresh)

                  # drop it into the memcache again
                  memcache.set(api_utils.GETROUTES, json_response)
                  logging.debug('---> storing in memcache');


          # record the API call for this devkey
          api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETROUTES,self.request.query_string,self.request.remote_addr);

      #logging.debug('API: json response %s' % json_response);
      callback = self.request.get('callback')
      if callback is not '':
          self.response.headers['Content-Type'] = 'application/javascript'
          self.response.headers['Access-Control-Allow-Origin'] = '*'
          self.response.headers['Access-Control-Allow-Methods'] = 'GET'
          response = callback + '(' + json.dumps(json_response) + ');'
      else:
          self.response.headers['Content-Type'] = 'application/json'
          response = json_response

      self.response.out.write(response)
      stathat.apiStatCount()
Ejemplo n.º 4
0
    def get(self):

        # validate the request parameters
        devStoreKey = validateRequest(self.request)
        if devStoreKey is None:
            logging.debug("unable to validate the request parameters")
            self.response.headers['Content-Type'] = 'application/javascript'
            self.response.out.write(
                json.dumps(
                    api_utils.buildErrorResponse(
                        '-1', 'Illegal request parameters')))
            return

        # snare the inputs
        routeID = self.request.get('routeID')
        logging.debug('getvehicles request parameters...  routeID %s' %
                      routeID)

        if api_utils.afterHours() is True:
            # don't run these jobs during "off" hours
            json_response = api_utils.buildErrorResponse(
                '-1', 'The Metro service is not currently running')
        elif routeID is not '':
            json_response = routeRequest(routeID)
            api_utils.recordDeveloperRequest(devStoreKey,
                                             api_utils.GETVEHICLES,
                                             self.request.query_string,
                                             self.request.remote_addr)
        else:
            logging.error("API: invalid request")
            json_response = api_utils.buildErrorResponse(
                '-1',
                'Invalid Request parameters. Did you forget to include a routeID?'
            )
            api_utils.recordDeveloperRequest(
                devStoreKey, api_utils.GETVEHICLES, self.request.query_string,
                self.request.remote_addr, 'illegal query string combination')

        #logging.debug('API: json response %s' % json_response);
        # encapsulate response in json
        callback = self.request.get('callback')
        if callback is not '':
            self.response.headers['Content-Type'] = 'application/javascript'
            self.response.headers['Access-Control-Allow-Origin'] = '*'
            self.response.headers['Access-Control-Allow-Methods'] = 'GET'
            response = callback + '(' + json.dumps(json_response) + ');'
        else:
            self.response.headers['Content-Type'] = 'application/json'
            response = json.dumps(json_response)

        self.response.out.write(response)
        stathat.apiStatCount()
Ejemplo n.º 5
0
    def get(self):

      # validate the request parameters
      devStoreKey = validateRequest(self.request,api_utils.GETSTOPS)
      if devStoreKey is None:
          if( not (self.request.get('key') == 'kiosk' and self.request.get('stopID') == '') ):
              logging.error("failed to validate the request parameters")
          self.response.headers['Content-Type'] = 'application/javascript'
          self.response.out.write(json.dumps(api_utils.buildErrorResponse('-1','Illegal request parameters')))
          return
      
      # snare the inputs
      stopID = api_utils.conformStopID(self.request.get('stopID'))
      routeID = self.request.get('routeID')
      destination = self.request.get('destination').upper()
      logging.debug('getstops request parameters...  routeID %s destination %s' % (routeID,destination))
      
      if api_utils.afterHours() is True:
          # don't run these jobs during "off" hours
	      json_response = api_utils.buildErrorResponse('-1','The Metro service is not currently running')
      elif routeID is not '' and destination is '':
          json_response = routeRequest(routeID, None)
          api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETSTOPS,self.request.query_string,self.request.remote_addr);
      elif routeID is not '' and destination is not '':
          json_response = routeRequest(routeID, destination)
          api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETSTOPS,self.request.query_string,self.request.remote_addr);
      else:
          logging.error("API: invalid request")
          json_response = api_utils.buildErrorResponse('-1','Invalid Request parameters. Did you forget to include a routeID?')
          api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETSTOPS,self.request.query_string,self.request.remote_addr,'illegal query string combination');

      #logging.debug('API: json response %s' % json_response);    
      # encapsulate response in json
      callback = self.request.get('callback')
      if callback is not '':
          self.response.headers['Content-Type'] = 'application/javascript'
          self.response.headers['Access-Control-Allow-Origin'] = '*'
          self.response.headers['Access-Control-Allow-Methods'] = 'GET'
          response = callback + '(' + json.dumps(json_response) + ');'
      else:
          self.response.headers['Content-Type'] = 'application/json'
          response = json.dumps(json_response)
      
      self.response.out.write(response)
      stathat.apiStatCount()
      # push event out to anyone watching the live board
      task = Task(url='/map/task', params={'stopID':stopID})
      task.add('eventlogger')
Ejemplo n.º 6
0
 def post(self):
     self.response.headers['Content-Type'] = 'application/javascript'
     self.response.out.write(
         json.dumps(
             api_utils.buildErrorResponse(
                 '-1', 'The API does not support POST requests')))
     return
Ejemplo n.º 7
0
 def get(self):
   
   # validate the request parameters
   devStoreKey = validateRequest(self.request)
   if devStoreKey is None:
       logging.warning("API: unsupported method")
       self.response.headers['Content-Type'] = 'application/javascript'
       self.response.out.write(json.dumps(api_utils.buildErrorResponse('-1','This method is not yet enabled')))
       return
Ejemplo n.º 8
0
    def get(self):

        # validate the request parameters
        devStoreKey = validateRequest(self.request)
        if devStoreKey is None:
            logging.debug("unable to validate the request parameters")
            self.response.headers['Content-Type'] = 'application/javascript'
            self.response.out.write(json.dumps(api_utils.buildErrorResponse('-1','Illegal request parameters')))
            return

        # snare the inputs
        routeID = self.request.get('routeID')
        if len(routeID) == 1:
            routeID = "0" + routeID
        logging.debug('getvehicles request parameters...  routeID %s' % routeID)

        if api_utils.afterHours() is True:
            # don't run these jobs during "off" hours
            json_response = api_utils.buildErrorResponse('-1', 'The Metro service is not currently running')
        elif routeID is not '':
            json_response = routeRequest(routeID)
            api_utils.recordDeveloperRequest(devStoreKey, api_utils.GETVEHICLES, self.request.query_string, self.request.remote_addr);
        else:
            logging.error("API: invalid request")
            json_response = api_utils.buildErrorResponse('-1','Invalid Request parameters. Did you forget to include a routeID?')
            api_utils.recordDeveloperRequest(devStoreKey, api_utils.GETVEHICLES, self.request.query_string, self.request.remote_addr,'illegal query string combination');

        #logging.debug('API: json response %s' % json_response);
        # encapsulate response in json
        callback = self.request.get('callback')
        if callback is not '':
            self.response.headers['Content-Type'] = 'application/javascript'
            self.response.headers['Access-Control-Allow-Origin'] = '*'
            self.response.headers['Access-Control-Allow-Methods'] = 'GET'
            response = callback + '(' + json.dumps(json_response) + ');'
        else:
            self.response.headers['Content-Type'] = 'application/json'
            response = json.dumps(json_response)

        self.response.out.write(response)
        stathat.apiStatCount()
Ejemplo n.º 9
0
    def get(self):

        # validate the request parameters
        devStoreKey = validateRequest(self.request)
        if devStoreKey is None:
            logging.warning("API: unsupported method")
            self.response.headers['Content-Type'] = 'application/javascript'
            self.response.out.write(
                json.dumps(
                    api_utils.buildErrorResponse(
                        '-1', 'This method is not yet enabled')))
            return
Ejemplo n.º 10
0
def routeRequest(routeID):
    loop = 0
    done = False
    result = None
    while not done and loop < 3:
        try:
            url = VEHICLE_URL_BASE + routeID
            result = urlfetch.fetch(url)
            done = True
        except urlfetch.DownloadError:
            logging.error("Error loading page (%s)... sleeping" % loop)
            if result:
                logging.debug("Error status: %s" % result.status_code)
                logging.debug("Error header: %s" % result.headers)
                logging.debug("Error content: %s" % result.content)
            time.sleep(6)
            loop = loop + 1

    if result is None or result.status_code != 200:
        logging.error("Exiting early: error fetching URL: " +
                      result.status_code)
        return api_utils.buildErrorResponse('-1',
                                            'Error reading live Metro feed')

    dataArray = result.content.split('*')
    logging.debug('timestamp is %s' % dataArray[0])
    timestamp = dataArray[0]

    vehicles = dataArray[2].split(';')
    results = dict({
        'status': 0,
        'routeID': routeID,
        'count': len(vehicles) - 1,
        'timestamp': timestamp,
        'vehicles': list()
    })
    for v in vehicles:
        if v == vehicles[-1]:
            break
        location = v.split('|')
        next = location[3].split('<br>')
        spot = dict({
            'lat': location[0],
            'lon': location[1],
            'direction': re.sub('<[^>]*>', '', next[0]),
            'vehicleID': next[1].split(':')[1].lstrip(),
            'nextStop': next[2].split(':')[1].lstrip()
        })
        results['vehicles'].append(spot)

    return results
Ejemplo n.º 11
0
def routeRequest(routeID):
    loop = 0
    done = False
    result = None
    while not done and loop < 3:
        try:
          url = VEHICLE_URL_BASE + routeID
          result = urlfetch.fetch(url)
          done = True;
        except urlfetch.DownloadError:
          logging.error("Error loading page (%s)... sleeping" % loop)
          if result:
            logging.debug("Error status: %s" % result.status_code)
            logging.debug("Error header: %s" % result.headers)
            logging.debug("Error content: %s" % result.content)
          time.sleep(6)
          loop = loop+1
           
    if result is None or result.status_code != 200:
        logging.error("Exiting early: error fetching URL: " + result.status_code)
        return api_utils.buildErrorResponse('-1','Error reading live Metro feed')
    
    dataArray = result.content.split('*')
    logging.debug('timestamp is %s' % dataArray[0])
    timestamp = dataArray[0]
    
    vehicles = dataArray[2].split(';')
    results = dict({'status' : 0,
                    'routeID' : routeID,
                    'count' : len(vehicles)-1, 
                    'timestamp' : timestamp, 
                    'vehicles' : list()
                    })
    for v in vehicles:
        if v == vehicles[-1]:
            break
        location = v.split('|')
        next = location[3].split('<br>')
        spot = dict({'lat':location[0],
                     'lon':location[1],
                     'direction':re.sub('<[^>]*>', '', next[0]),
                     'vehicleID':next[1].split(':')[1].lstrip(),
                     'nextStop':next[2].split(':')[1].lstrip()
                   })
        results['vehicles'].append(spot)
    
    return results   
Ejemplo n.º 12
0
    def get(self):

        # validate the request parameters
        devStoreKey = validateRequest(self.request, api_utils.GETNEARBYSTOPS)
        if devStoreKey is None:
            logging.error("unable to validate the request parameters")
            self.response.headers['Content-Type'] = 'application/json'
            self.response.out.write(
                json.dumps(
                    api_utils.buildErrorResponse(
                        '-1', 'Illegal request parameters')))
            return

        # snare the inputs
        lat = float(self.request.get('lat'))
        lon = float(self.request.get('lon'))
        radius = self.request.get('radius')
        if radius == '' or radius is None:
            radius = 100
        else:
            radius = int(radius)
        routeID = self.request.get('routeID')
        destination = self.request.get('destination')

        # stop location requests...
        json_response = nearbyStops(lat, lon, radius, routeID, destination)

        # encapsulate response in json
        #logging.debug('API: json response %s' % response);
        callback = self.request.get('callback')
        if callback is not '':
            self.response.headers['Content-Type'] = 'application/javascript'
            self.response.headers['Access-Control-Allow-Origin'] = '*'
            self.response.headers['Access-Control-Allow-Methods'] = 'GET'
            response = callback + '(' + json.dumps(json_response) + ');'
        else:
            self.response.headers['Content-Type'] = 'application/json'
            response = json.dumps(json_response)

        self.response.out.write(response)
        stathat.apiStatCount()
Ejemplo n.º 13
0
    def get(self):
      
      # validate the request parameters
      devStoreKey = validateRequest(self.request,api_utils.GETNEARBYSTOPS)
      if devStoreKey is None:
          logging.error("unable to validate the request parameters")
          self.response.headers['Content-Type'] = 'application/json'
          self.response.out.write(json.dumps(api_utils.buildErrorResponse('-1','Illegal request parameters')))
          return
      
      # snare the inputs
      lat = float(self.request.get('lat'))
      lon = float(self.request.get('lon'))
      radius = self.request.get('radius')
      if radius == '' or radius is None:
          radius = 100
      else:
          radius = int(radius)
      routeID = self.request.get('routeID')
      direction = self.request.get('direction')
      
      # stop location requests...
      json_response = nearbyStops(lat,lon,radius,routeID,direction)

      # encapsulate response in json
      #logging.debug('API: json response %s' % response);
      callback = self.request.get('callback')
      if callback is not '':
          self.response.headers['Content-Type'] = 'application/javascript'
          self.response.headers['Access-Control-Allow-Origin'] = '*'
          self.response.headers['Access-Control-Allow-Methods'] = 'GET'
          response = callback + '(' + json.dumps(json_response) + ');'
      else:
          self.response.headers['Content-Type'] = 'application/json'
          response = json.dumps(json_response)

      self.response.out.write(response)
      stathat.apiStatCount()
Ejemplo n.º 14
0
def routeRequest(routeID):

    # need to first translate the routeID into the
    # internal Metro code for that route.
    route = asynch.getRouteListing(routeID=routeID)
    if not route or len(route) is 0:
        logging.error("Exiting early: unable to locate route listing: " + routeID)
        return api_utils.buildErrorResponse('-1', 'Unknown routeID')
    else:
        metro_route_code = route[0].routeCode
        logging.debug('%s - %s' % (routeID, metro_route_code))

    # now go fetch the vehicle details from Metro...
    loop = 0
    done = False
    result = None
    while not done and loop < 3:
        try:
            payload = {}
            payload['routeID'] = metro_route_code
            headers = {'Content-Type': 'application/json'}
            result = urlfetch.fetch(
                url=VEHICLE_URL_BASE,
                payload=json.dumps(payload),
                method=urlfetch.POST,
                headers=headers)
            done = True
        except urlfetch.Error:
            logging.error("Error loading page (%s)... sleeping" % loop)
            if result:
                logging.debug("Error status: %s" % result.status_code)
                logging.debug("Error header: %s" % result.headers)
                logging.debug("Error content: %s" % result.content)
            time.sleep(6)
            loop = loop+1

    if result is None or result.status_code != 200:
        logging.error("Exiting early: error fetching URL: " + result.status_code)
        return api_utils.buildErrorResponse('-1', 'Error reading live Metro feed')

    # vehicle results are in a JSON array
    # { "d" : [ {}, {} ] }
    json_result = json.loads(result.content)
    vehicles = json_result['d']
    if vehicles:
        vehicle_count = len(vehicles)
    else:
        vehicle_count = 0

    # setup the core response object
    results = dict({'status' : 0,
                    'routeID' : routeID,
                    'count' : vehicle_count,
                    'timestamp' : api_utils.getLocalTimestamp(),
                    'vehicles' : list()})
    
    if vehicles:
        # loop through all vehicles on the route and parse
        # out details for the response
        for v in vehicles:
            if v == vehicles[-1]:
                break
            spot = dict({'lat':v['lat'],
                        'lon':v['lon'],
                        'direction':v['directionName'],
                        'vehicleID':v['propertyTag'],
                        'nextStop':v['nextStop'],

                        'bikeRack':v['bikeRack'],
                        'wifiAccess':v['wiFiAccess'],
                        'wheelChairAccessible':v['wheelChairAccessible'],
                        'wheelChairLift':v['wheelChairLift']})
            results['vehicles'].append(spot)

    return results
Ejemplo n.º 15
0
 def post(self):
     self.response.headers['Content-Type'] = 'application/javascript'
     self.response.out.write(json.dumps(api_utils.buildErrorResponse('-1','The API does not support POST requests')))
     return
Ejemplo n.º 16
0
    def get(self):
        start = time.time()
        # snare the inputs
        dev_key = self.request.get('key')
        stopID = api_utils.conformStopID(self.request.get('stopID'))
        routeID = self.request.get('routeID')
        vehicleID = self.request.get('vehicleID')
        #logging.debug('getarrivals request parameters...  stopID %s routeID %s vehicleID %s' % (stopID,routeID,vehicleID))

        self.request.registry['aggregated_results'] = []

        try:
            if api_utils.afterHours() is False:  # and dev_key != 'uwkiosk9':

                # validate the request parameters
                devStoreKey = validateRequest(self.request)
                if devStoreKey is None:
                    # filter out the kiosk errors from the log
                    if (not (dev_key == 'kiosk'
                             and self.request.get('stopID') == '')):
                        logging.error(
                            "failed to validate the request parameters")
                    self.response.headers[
                        'Content-Type'] = 'application/javascript'
                    self.response.out.write(
                        json.dumps(
                            api_utils.buildErrorResponse(
                                '-1',
                                'Unable to validate the request. There may be an illegal developer key.'
                            )))
                    return

                if stopID is not '' and routeID is '':
                    json_response = stopRequest(stopID, dev_key)
                    api_utils.recordDeveloperRequest(devStoreKey,
                                                     api_utils.GETARRIVALS,
                                                     self.request.query_string,
                                                     self.request.remote_addr)
                elif stopID is not '' and routeID is not '':
                    json_response = stopRouteRequest(stopID, routeID,
                                                     devStoreKey)
                    api_utils.recordDeveloperRequest(devStoreKey,
                                                     api_utils.GETARRIVALS,
                                                     self.request.query_string,
                                                     self.request.remote_addr)
                elif routeID is not '' and vehicleID is not '':
                    json_response = routeVehicleRequest(
                        routeID, vehicleID, devStoreKey)
                    api_utils.recordDeveloperRequest(devStoreKey,
                                                     api_utils.GETVEHICLE,
                                                     self.request.query_string,
                                                     self.request.remote_addr)
                else:
                    logging.debug("API: invalid request")
                    api_utils.recordDeveloperRequest(
                        devStoreKey, api_utils.GETARRIVALS,
                        self.request.query_string, self.request.remote_addr,
                        'illegal query string combination')
                    json_response = api_utils.buildErrorResponse(
                        '-1', 'Invalid Request parameters')

                # push event out to anyone watching the live board
                channels = memcache.get('channels')
                if channels is not None:
                    task = Task(url='/map/task', params={'stopID': stopID})
                    task.add('eventlogger')

                # stop statistics - DISABLED
                # if( "kiosk" not in dev_key ):
                #     task = Task(url='/stats/stop', params={'apikey':dev_key,'stop':stopID})
                #     task.add('stats')

            else:
                # don't run these jobs during "off" hours
                #logging.debug('shunted... off hour request')
                #if dev_key.find('kiosk') >= 0:
                #  json_response = api_utils.buildErrorResponse('-1','Kiosk requests no longer supported')
                #else:
                json_response = api_utils.buildErrorResponse(
                    '-1', 'The Metro service is not currently running')

            # encapsulate response in json or jsonp
            callback = self.request.get('callback')
            if callback is not '':
                self.response.headers[
                    'Content-Type'] = 'application/javascript'
                self.response.headers['Access-Control-Allow-Origin'] = '*'
                self.response.headers['Access-Control-Allow-Methods'] = 'GET'
                response = callback + '(' + json.dumps(json_response) + ');'
            else:
                self.response.headers['Content-Type'] = 'application/json'
                response = json.dumps(json_response)

            self.response.out.write(response)
        except DeadlineExceededError:
            self.response.clear()
            self.response.set_status(500)
            self.response.out.write(
                "This operation could not be completed in time...")

        # persist some statistics
        # stathat:
        if api_utils.afterHours() is False and dev_key != 'uwkiosk9':
            stathat.apiTimeStat(config.STATHAT_API_GETARRIVALS_TIME_KEY,
                                ((time.time() - start) * 1000))
            stathat.apiStatCount()
Ejemplo n.º 17
0
 def post(self):
     self.response.headers["Content-Type"] = "application/javascript"
     self.response.out.write(
         json.dumps(api_utils.buildErrorResponse("-1", "The API does not support POST requests"))
     )
     return
Ejemplo n.º 18
0
    def get(self):
      start = time.time()
      # snare the inputs
      dev_key = self.request.get('key')
      stopID = api_utils.conformStopID(self.request.get('stopID'))
      routeID = self.request.get('routeID')
      vehicleID = self.request.get('vehicleID')
      #logging.debug('getarrivals request parameters...  stopID %s routeID %s vehicleID %s' % (stopID,routeID,vehicleID))

      self.request.registry['aggregated_results'] = []

      try:
          if api_utils.afterHours() is False:  # and dev_key != 'uwkiosk9':

              # validate the request parameters
              devStoreKey = validateRequest(self.request)
              if devStoreKey is None:
                  # filter out the kiosk errors from the log
                  if( not (dev_key == 'kiosk' and self.request.get('stopID') == '') ):
                      logging.error("failed to validate the request parameters")
                  self.response.headers['Content-Type'] = 'application/javascript'
                  self.response.out.write(json.dumps(api_utils.buildErrorResponse('-1','Unable to validate the request. There may be an illegal developer key.')))
                  return

              if stopID is not '' and routeID is '':
                  json_response = stopRequest(stopID, dev_key)
                  api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETARRIVALS,self.request.query_string,self.request.remote_addr);
              elif stopID is not '' and routeID is not '':
                  json_response = stopRouteRequest(stopID, routeID, devStoreKey)
                  api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETARRIVALS,self.request.query_string,self.request.remote_addr);
              elif routeID is not '' and vehicleID is not '':
                  json_response = routeVehicleRequest(routeID, vehicleID, devStoreKey)
                  api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETVEHICLE,self.request.query_string,self.request.remote_addr);
              else:
                  logging.debug("API: invalid request")
                  api_utils.recordDeveloperRequest(devStoreKey,api_utils.GETARRIVALS,self.request.query_string,self.request.remote_addr,'illegal query string combination');
                  json_response = api_utils.buildErrorResponse('-1','Invalid Request parameters')

              # push event out to anyone watching the live board
              channels = memcache.get('channels')
              if channels is not None:
                  task = Task(url='/map/task', params={'stopID':stopID})
                  task.add('eventlogger')

              # stop statistics - DISABLED
              # if( "kiosk" not in dev_key ):
              #     task = Task(url='/stats/stop', params={'apikey':dev_key,'stop':stopID})
              #     task.add('stats')

          else:
              # don't run these jobs during "off" hours
              #logging.debug('shunted... off hour request')
              #if dev_key.find('kiosk') >= 0:
              #  json_response = api_utils.buildErrorResponse('-1','Kiosk requests no longer supported')
              #else:
              json_response = api_utils.buildErrorResponse('-1','The Metro service is not currently running')

          # encapsulate response in json or jsonp
          callback = self.request.get('callback')
          if callback is not '':
              self.response.headers['Content-Type'] = 'application/javascript'
              self.response.headers['Access-Control-Allow-Origin'] = '*'
              self.response.headers['Access-Control-Allow-Methods'] = 'GET'
              response = callback + '(' + json.dumps(json_response) + ');'
          else:
              self.response.headers['Content-Type'] = 'application/json'
              response = json.dumps(json_response)

          self.response.out.write(response)
      except DeadlineExceededError:
          self.response.clear()
          self.response.set_status(500)
          self.response.out.write("This operation could not be completed in time...")

      # persist some statistics
      # stathat:
      if api_utils.afterHours() is False and dev_key != 'uwkiosk9':
        stathat.apiTimeStat(config.STATHAT_API_GETARRIVALS_TIME_KEY,((time.time()-start)*1000))
        stathat.apiStatCount()