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)
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, []
def _notifyFailed(self, failure): logger.log_warning("NOTIFY failed: %s" % str(failure))