Example #1
0
 def _sendAlive(self, usn, nt, udn):
     if not usn in self.advertisements:
         logger.log_warning("no registered advertisement for %s" % usn)
         return
     adv = self.advertisements[usn]
     resp = [
         'NOTIFY * HTTP/1.1',
         'HOST: 239.255.255.250:1900',
         'NTS: ssdp:alive',
         'NT: %s' % nt,
         'USN: %s' % usn,
         'LOCATION: http://%s:%d/%s' % (self.interface.address, 1900, udn.replace(':','_')),
         'CACHE-CONTROL: max-age=%d' % self.expires,
         'SERVER: Twisted, UPnP/1.0, Higgins'
         ]
     self.transport.write('\r\n'.join(resp) + '\r\n\r\n', (SSDP_MULTICAST_GROUP, 1900))
     logger.log_debug("sent ssdp:alive for %s on %s" % (usn, self.interface.address))
     adv.delayed = reactor.callLater(self.expires, self._sendAlive, usn, nt, udn)
Example #2
0
 def locateChild(self, request, segments):
     segments = [part for part in segments if part != '']
     logger.log_debug("%s" % '/' + '/'.join(segments))
     # we need the Host header
     if request.host == None:
         logger.log_warning("can't determine host from request, ignoring")
         return None, []
     # this is a fix for coherence (seen on v0.6.2), which doesn't send the
     # port number as part of the Host header.
     urlparts = urlparse('http://' + request.host)
     host = '%s:1901' % urlparts.netloc
     # / returns 404
     if segments == []:
         return None, []
     # the first segment is the device UDN with ':' escaped as '_'
     device_id = segments[0].replace('_',':')
     try:
         device = self.server.devices[device_id]
     except:
         logger.log_warning("device '%s' doesn't exist" % device_id)
         return None, []
     # if the next segment is 'root-device.xml', return the device description
     segments = segments[1:]
     if segments == []:
         return StaticResource(device.getDescription(host, True), 'text/xml'), []
     # otherwise the next segment is the service ID
     service_id = segments[0].replace('_',':')
     try:
         service = device._services[service_id]
     except:
         logger.log_warning("service '%s' doesn't exist" % service_id)
         return None, []
     segments = segments[1:]
     if segments == []:
         return StaticResource(service.getDescription(), 'text/xml'), []
     if segments[0] == 'control':
         return ControlResource(service), []
     if segments[0] == 'event':
         return EventResource(service), []
     return None, []
Example #3
0
 def _notifyFailed(self, failure):
     logger.log_warning("NOTIFY failed: %s" % str(failure))