196 lines
6.7 KiB
Plaintext
Executable File
196 lines
6.7 KiB
Plaintext
Executable File
<% @Page Language="C#" ContentType="image/gif"%><%
|
|
@Import Namespace="System.Net" %><%
|
|
@Import Namespace="System.Security.Cryptography" %><%
|
|
@Import Namespace="System.Text" %><script runat="server" language="c#">
|
|
/**
|
|
Copyright 2009 Google Inc. All Rights Reserved.
|
|
**/
|
|
|
|
// Tracker version.
|
|
private const string Version = "4.4sa";
|
|
|
|
private const string CookieName = "__utmmobile";
|
|
|
|
// The path the cookie will be available to, edit this to use a different
|
|
// cookie path.
|
|
private const string CookiePath = "/";
|
|
|
|
// Two years in seconds.
|
|
private readonly TimeSpan CookieUserPersistence = TimeSpan.FromSeconds(63072000);
|
|
|
|
// 1x1 transparent GIF
|
|
private readonly byte[] GifData = {
|
|
0x47, 0x49, 0x46, 0x38, 0x39, 0x61,
|
|
0x01, 0x00, 0x01, 0x00, 0x80, 0xff,
|
|
0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
|
|
0x00, 0x2c, 0x00, 0x00, 0x00, 0x00,
|
|
0x01, 0x00, 0x01, 0x00, 0x00, 0x02,
|
|
0x02, 0x44, 0x01, 0x00, 0x3b
|
|
};
|
|
|
|
private static readonly Regex IpAddressMatcher =
|
|
new Regex(@"^([^.]+\.[^.]+\.[^.]+\.).*");
|
|
|
|
// A string is empty in our terms, if it is null, empty or a dash.
|
|
private static bool IsEmpty(string input) {
|
|
return input == null || "-" == input || "" == input;
|
|
}
|
|
|
|
// The last octect of the IP address is removed to anonymize the user.
|
|
private static string GetIP(string remoteAddress) {
|
|
if (IsEmpty(remoteAddress)) {
|
|
return "";
|
|
}
|
|
// Capture the first three octects of the IP address and replace the forth
|
|
// with 0, e.g. 124.455.3.123 becomes 124.455.3.0
|
|
Match m = IpAddressMatcher.Match(remoteAddress);
|
|
if (m.Success) {
|
|
return m.Groups[1] + "0";
|
|
} else {
|
|
return "";
|
|
}
|
|
}
|
|
|
|
// Generate a visitor id for this hit.
|
|
// If there is a visitor id in the cookie, use that, otherwise
|
|
// use the guid if we have one, otherwise use a random number.
|
|
private static string GetVisitorId(
|
|
string guid, string account, string userAgent, HttpCookie cookie) {
|
|
|
|
// If there is a value in the cookie, don't change it.
|
|
if (cookie != null && cookie.Value != null) {
|
|
return cookie.Value;
|
|
}
|
|
|
|
String message;
|
|
if (!IsEmpty(guid)) {
|
|
// Create the visitor id using the guid.
|
|
message = guid + account;
|
|
} else {
|
|
// otherwise this is a new user, create a new random id.
|
|
message = userAgent + GetRandomNumber() + Guid.NewGuid().ToString();
|
|
}
|
|
|
|
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
|
|
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
|
|
byte[] sum = md5.ComputeHash(messageBytes);
|
|
|
|
string md5String = BitConverter.ToString(sum);
|
|
md5String = md5String.Replace("-","");
|
|
|
|
md5String = md5String.PadLeft(32, '0');
|
|
|
|
return "0x" + md5String.Substring(0, 16);
|
|
}
|
|
|
|
// Get a random number string.
|
|
private static String GetRandomNumber() {
|
|
Random RandomClass = new Random();
|
|
return RandomClass.Next(0x7fffffff).ToString();
|
|
}
|
|
|
|
// Writes the bytes of a 1x1 transparent gif into the response.
|
|
private void WriteGifData() {
|
|
Response.AddHeader(
|
|
"Cache-Control",
|
|
"private, no-cache, no-cache=Set-Cookie, proxy-revalidate");
|
|
Response.AddHeader("Pragma", "no-cache");
|
|
Response.AddHeader("Expires", "Wed, 17 Sep 1975 21:32:10 GMT");
|
|
Response.Buffer = false;
|
|
Response.OutputStream.Write(GifData, 0, GifData.Length);
|
|
}
|
|
|
|
// Make a tracking request to Google Analytics from this server.
|
|
// Copies the headers from the original request to the new one.
|
|
// If request containg utmdebug parameter, exceptions encountered
|
|
// communicating with Google Analytics are thown.
|
|
private void SendRequestToGoogleAnalytics(string utmUrl) {
|
|
try {
|
|
WebRequest connection = WebRequest.Create(utmUrl);
|
|
|
|
((HttpWebRequest)connection).UserAgent = Request.UserAgent;
|
|
connection.Headers.Add("Accepts-Language",
|
|
Request.Headers.Get("Accepts-Language"));
|
|
|
|
using (WebResponse resp = connection.GetResponse()) {
|
|
// Ignore response
|
|
}
|
|
} catch (Exception ex) {
|
|
if (Request.QueryString.Get("utmdebug") != null) {
|
|
throw new Exception("Error contacting Google Analytics", ex);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Track a page view, updates all the cookies and campaign tracker,
|
|
// makes a server side request to Google Analytics and writes the transparent
|
|
// gif byte data to the response.
|
|
private void TrackPageView() {
|
|
TimeSpan timeSpan = (DateTime.Now - new DateTime(1970, 1, 1).ToLocalTime());
|
|
string timeStamp = timeSpan.TotalSeconds.ToString();
|
|
string domainName = Request.ServerVariables["SERVER_NAME"];
|
|
if (IsEmpty(domainName)) {
|
|
domainName = "";
|
|
}
|
|
|
|
// Get the referrer from the utmr parameter, this is the referrer to the
|
|
// page that contains the tracking pixel, not the referrer for tracking
|
|
// pixel.
|
|
string documentReferer = Request.QueryString.Get("utmr");
|
|
if (IsEmpty(documentReferer)) {
|
|
documentReferer = "-";
|
|
} else {
|
|
documentReferer = HttpUtility.UrlDecode(documentReferer);
|
|
}
|
|
string documentPath = Request.QueryString.Get("utmp");
|
|
if (IsEmpty(documentPath)) {
|
|
documentPath = "";
|
|
} else {
|
|
documentPath = HttpUtility.UrlDecode(documentPath);
|
|
}
|
|
|
|
string account = Request.QueryString.Get("utmac");
|
|
string userAgent = Request.UserAgent;
|
|
if (IsEmpty(userAgent)) {
|
|
userAgent = "";
|
|
}
|
|
|
|
// Try and get visitor cookie from the request.
|
|
HttpCookie cookie = Request.Cookies.Get(CookieName);
|
|
|
|
string visitorId = GetVisitorId(
|
|
Request.Headers.Get("X-DCMGUID"), account, userAgent, cookie);
|
|
|
|
// Always try and add the cookie to the response.
|
|
HttpCookie newCookie = new HttpCookie(CookieName);
|
|
newCookie.Value = visitorId;
|
|
newCookie.Expires = DateTime.Now + CookieUserPersistence;
|
|
newCookie.Path = CookiePath;
|
|
Response.Cookies.Add(newCookie);
|
|
|
|
string utmGifLocation = "http://www.google-analytics.com/__utm.gif";
|
|
|
|
// Construct the gif hit url.
|
|
string utmUrl = utmGifLocation + "?" +
|
|
"utmwv=" + Version +
|
|
"&utmn=" + GetRandomNumber() +
|
|
"&utmhn=" + HttpUtility.UrlEncode(domainName) +
|
|
"&utmr=" + HttpUtility.UrlEncode(documentReferer) +
|
|
"&utmp=" + HttpUtility.UrlEncode(documentPath) +
|
|
"&utmac=" + account +
|
|
"&utmcc=__utma%3D999.999.999.999.999.1%3B" +
|
|
"&utmvid=" + visitorId +
|
|
"&utmip=" + GetIP(Request.ServerVariables["REMOTE_ADDR"]);
|
|
|
|
SendRequestToGoogleAnalytics(utmUrl);
|
|
|
|
// If the debug parameter is on, add a header to the response that contains
|
|
// the url that was used to contact Google Analytics.
|
|
if (Request.QueryString.Get("utmdebug") != null) {
|
|
Response.AddHeader("X-GA-MOBILE-URL", utmUrl);
|
|
}
|
|
// Finally write the gif data to the response.
|
|
WriteGifData();
|
|
}
|
|
</script><% TrackPageView(); %>
|