#!/usr/bin/env python ''' :copyright: (c) 2015 by 51Degrees.com, see README.md for more details. :license: MPL2, see LICENSE.txt for more details. ''' # // Snippet Start from BaseHTTPServer import BaseHTTPRequestHandler import CGIHTTPServer import cgitb; cgitb.enable() ## This line enables CGI error reporting import urlparse import os import string from FiftyOneDegrees import fiftyone_degrees_mobile_detector_v3_wrapper #################################################### # Set html links globally #################################################### dataOptions = ('Compare Data Options') methodHyperLinkUA = ('About Metrics') methodHyperLinkHeaders = ('About Metrics') propertiesHyperLinkUA = ('All Properties') propertiesHyperLinkHeaders = ('All Properties') propertyNotFound = ('Switch Data Set') ####################################################### #------------------------------------------------------ # Handler function # Called on each request #------------------------------------------------------ ####################################################### class GetHandler(CGIHTTPServer.CGIHTTPRequestHandler): def do_GET(self): self.send_response(200, 'OK') self.send_header('Content-type', 'text/html') self.end_headers() ################################################### # Fetch http headers from browser request ################################################### headers = self.headers #################################################### # If usage sharing is enabled, share with 51Degrees # (core must be installed for this to work). #################################################### if shareUsage == 'True': client_ip = headers.get('client_ip') from fiftyone_degrees.mobile_detector import usage usage.UsageSharer.instance().record(client_ip, http_headers) #################################################### # Begin html formatting #################################################### self.wfile.write('') self.wfile.write('') self.wfile.write('') self.wfile.write('') self.wfile.write('
') self.wfile.write('

') self.wfile.write('

Python Pattern - Device Detection ' 'Server Example

') ##################################################### # Output data set information ##################################################### self.wfile.write('') self.wfile.write('') self.wfile.write('' '' % (provider.getDataSetName(), dataOptions)) self.wfile.write(''\ % provider.getDataSetFormat()) self.wfile.write(''\ % provider.getDataSetPublishedDate()) self.wfile.write(''\ % provider.getDataSetNextUpdateDate()) self.wfile.write(''\ % provider.getDataSetSignatureCount()) self.wfile.write(''\ % provider.getDataSetDeviceCombinations()) self.wfile.write('
Data Set Information
Name%s%s
Format%s
Published Date%s
Next Update Date%s
Signature Count%d
Device Combinations%d
') ##################################################### # Perform match with single User-Agent ##################################################### userAgent = headers.get('user-agent') match = provider.getMatch(userAgent) ####################################################### # Output properties from match ####################################################### self.outputProperties(match, propertiesHyperLinkUA, methodHyperLinkUA) ######################################################## # Set http headers from browser ######################################################## httpHeaders = fiftyone_degrees_mobile_detector_v3_wrapper\ .MapStringString() self.wfile.write('') self.wfile.write('') self.wfile.write('') for header in importantHeaders: value = headers.get(header) if value: self.wfile.write(''\ % (header, value)) httpHeaders.__setitem__(header, value) else: self.wfile.write(''\ % (header, 'header not set')) self.wfile.write('
Match with HTTP Headers' '
Relevant HTTP Headers
%s%s
%s%s
') ######################################################## # Perform match with multiple http headers ######################################################## match = provider.getMatch(httpHeaders) ######################################################## # Output properties ######################################################## self.outputProperties(match, propertiesHyperLinkHeaders, methodHyperLinkHeaders) ####################################################### # End html formatting ####################################################### self.wfile.write('
') self.wfile.write('') self.wfile.write('') ######################################################### # Function which outputs match properties in table ######################################################### def outputProperties(self, match, propertiesHyperLink, methodHyperLink): self.wfile.write('') self.wfile.write('' % methodHyperLink) self.wfile.write(''\ % match.getDeviceId()) self.wfile.write(''\ % match.getMethod()) self.wfile.write(''\ % match.getDifference()) self.wfile.write(''\ % match.getRank()) self.wfile.write('' % (len(properties.split(',')) + 1, propertiesHyperLink)) for property in properties.split(','): value = ' '.join(match.getValues(property)) if value: self.wfile.write(''\ % (property, property, property, value)) else: self.wfile.write(''\ % (property, property, property, propertyNotFound)) self.wfile.write('
Match Metrics%s
Id%s
Method%d
Difference%d
Rank%d
Device Properties%s
%s%s
%s%s
') ####################################################### #------------------------------------------------------ # Function to exit cleanly #------------------------------------------------------ ####################################################### def ctrlc(sig, frame): print '\nExiting...' server.server_close() exit(0) ####################################################### #------------------------------------------------------ # Main function # Called when starting server #------------------------------------------------------ ####################################################### if __name__ == '__main__': from BaseHTTPServer import HTTPServer import signal ####################################################### # Set the match parameters ####################################################### properties = ('BrowserName,BrowserVendor,BrowserVersion,DeviceType,' 'HardwareVendor,IsTablet,IsMobile,IsCrawler,ScreenInchesDiagonal,' 'ScreenPixelsWidth') dataFile = os.path.expanduser('~/51Degrees/51Degrees-LiteV3.2.dat') cacheSize = 1000 poolSize = 20 shareUsage = 'False' # Needs Device Detection Python # Core installed for usage sharing ####################################################### # Initialize the provider ####################################################### provider = fiftyone_degrees_mobile_detector_v3_wrapper.Provider( dataFile, properties, cacheSize, poolSize) ####################################################### # Fetch important headers from workset ####################################################### importantHeaders = provider.getHttpHeaders() ####################################################### # Setup server ####################################################### server_address = 'localhost' server_port = 8080 server = HTTPServer((server_address, server_port), GetHandler) print 'Starting server at %s:%d, use to stop'\ % (server_address, server_port) signal.signal(signal.SIGINT, ctrlc) server.serve_forever() # // Snippet End