162403f0a5c9883baf6aca529af7570383114b8b
larrym
Tue Apr 3 16:13:55 2012 -0700
redirect code has gotten pretty long, so I moved it out of main
diff --git src/hg/hgGateway/hgGateway.c src/hg/hgGateway/hgGateway.c
index 9bb7031..18acf5b 100644
--- src/hg/hgGateway/hgGateway.c
+++ src/hg/hgGateway/hgGateway.c
@@ -1,387 +1,391 @@
/* hgGateway - Human Genome Browser Gateway. */
#include "common.h"
#include "linefile.h"
#include "hash.h"
#include "cheapcgi.h"
#include "htmshell.h"
#include "obscure.h"
#include "web.h"
#include "cart.h"
#include "hdb.h"
#include "dbDb.h"
#include "hgFind.h"
#include "hCommon.h"
#include "hui.h"
#include "customTrack.h"
#include "hubConnect.h"
#include "hgConfig.h"
#include "jsHelper.h"
#include "hPrint.h"
#include "suggest.h"
#include "search.h"
#include "internet.h"
#include "geoMirror.h"
struct cart *cart = NULL;
struct hash *oldVars = NULL;
char *clade = NULL;
char *organism = NULL;
char *db = NULL;
void hgGateway()
/* hgGateway - Human Genome Browser Gateway. */
{
char *defaultPosition = hDefaultPos(db);
char *position = cloneString(cartUsualString(cart, "position", defaultPosition));
boolean gotClade = hGotClade();
char *survey = cfgOptionEnv("HGDB_SURVEY", "survey");
char *surveyLabel = cfgOptionEnv("HGDB_SURVEY_LABEL", "surveyLabel");
boolean supportsSuggest = assemblySupportsGeneSuggest(db);
/* JavaScript to copy input data on the change genome button to a hidden form
This was done in order to be able to flexibly arrange the UI HTML
*/
char *onChangeDB = "onchange=\"document.orgForm.db.value = document.mainForm.db.options[document.mainForm.db.selectedIndex].value; document.orgForm.submit();\"";
char *onChangeOrg = "onchange=\"document.orgForm.org.value = document.mainForm.org.options[document.mainForm.org.selectedIndex].value; document.orgForm.db.value = 0; document.orgForm.submit();\"";
char *onChangeClade = "onchange=\"document.orgForm.clade.value = document.mainForm.clade.options[document.mainForm.clade.selectedIndex].value; document.orgForm.org.value = 0; document.orgForm.db.value = 0; document.orgForm.submit();\"";
/*
If we are changing databases via explicit cgi request,
then remove custom track data which will
be irrelevant in this new database .
If databases were changed then use the new default position too.
*/
if (sameString(position, "genome") || sameString(position, "hgBatch"))
position = defaultPosition;
jsIncludeFile("jquery.js", NULL);
webIncludeResourceFile("jquery-ui.css");
jsIncludeFile("jquery-ui.js", NULL);
jsIncludeFile("ajax.js", NULL);
jsIncludeFile("autocomplete.js", NULL);
jsIncludeFile("hgGateway.js", NULL);
jsIncludeFile("utils.js", NULL);
puts(
"
"
"The UCSC Genome Browser was created by the \n"
"Genome Bioinformatics Group of UC Santa Cruz.\n"
"
"
"Software Copyright (c) The Regents of the University of California.\n"
"All rights reserved.\n"
"\n"
);
puts(
"");
if (hIsPreviewHost())
{
puts(""
"WARNING: This is our preview site. It is a weekly mirror of our internal development server for public access. "
"Data and tools here are under construction, have not been quality reviewed, and are subject to change "
"at any time. We provide this site for early access, with the warning that it is less available "
"and stable than our public site. For high-quality reviewed annotations on our production server, visit "
" http://genome.ucsc.edu."
"
");
}
else if (hIsPrivateHost())
{
puts("WARNING: This is our development and test site. It usually works, but it is filled with tracks in various "
"stages of construction, and others of little interest to people outside of our local group. "
"It is usually slow because we are building databases on it. The documentation is poor. "
"More data than usual is flat out wrong. Maybe you want to go to "
"genome.ucsc.edu instead.");
}
if (hIsGsidServer())
{
webNewSection("%s", "Sequence View\n");
printf("%s",
"Sequence View is a customized version of the UCSC Genome Browser, which is specifically tailored to provide functions needed for the GSID HIV Data Browser.\n");
}
hgPositionsHelpHtml(organism, db);
puts("
");
}
void doMiddle(struct cart *theCart)
/* Set up pretty web display and save cart in global. */
{
char *scientificName = NULL;
cart = theCart;
getDbGenomeClade(cart, &db, &organism, &clade, oldVars);
if (! hDbIsActive(db))
{
db = hDefaultDb();
organism = hGenome(db);
clade = hClade(organism);
}
scientificName = hScientificName(db);
if (hIsGsidServer())
cartWebStart(theCart, db, "GSID %s Sequence View (UCSC Genome Browser) Gateway \n", organism);
else
{
char buffer[128];
/* tell html routines *not* to escape htmlOut strings*/
htmlNoEscape();
buffer[0] = 0;
if (*scientificName != 0)
{
if (sameString(clade,"ancestor"))
safef(buffer, sizeof(buffer), "(%s Ancestor) ", scientificName);
else
safef(buffer, sizeof(buffer), "(%s) ", scientificName);
}
cartWebStart(theCart, db, "%s %s%s Gateway\n", organism, buffer, hBrowserName());
htmlDoEscape();
}
hgGateway();
cartWebEnd();
}
-char *excludeVars[] = {NULL};
-
-int main(int argc, char *argv[])
-/* Process command line. */
-{
-oldVars = hashNew(10);
-cgiSpoof(&argc, argv);
-
-if(cgiIsOnWeb())
+static void checkForGeoMirrorRedirect()
{
- // check IP for redirection
+// Implement Geo/IP based redirection
+//
// NOTE that we want to redirect people as quickly as possible, so for efficiency purposes, this code is designed to be
- // called BEFORE the cart is loaded (so we only use CGI parameters and/or cookies).
+// called from main BEFORE the cart is loaded (so we only use CGI parameters and/or cookies).
char *thisNodeStr = geoMirrorNode();
if (thisNodeStr)
{
char *redirectCookie = findCookieData("redirect");
char *redirect = cgiOptionalString("redirect");
fprintf(stderr, "GALT redirectCookie=%s redirect=%s\n",
redirectCookie, redirect); fflush(stderr); // DEBUG REMOVE
if (redirect == NULL && redirectCookie == NULL)
{
int thisNode = sqlUnsigned(thisNodeStr);
struct sqlConnection *centralConn = hConnectCentral();
char query[1024];
char *ipStr = cgiRemoteAddr();
bits32 ip = 0;
internetDottedQuadToIp(ipStr, &ip);
// we assume no overlaps in geoIpNode table, so we can use limit 1 to make query very efficient.
safef(query, sizeof query, "select ipStart, ipEnd, node from geoIpNode where %u >= ipStart order by ipStart desc limit 1", ip);
char **row;
struct sqlResult *sr = sqlGetResult(centralConn, query);
int defaultNode = 1;
if ((row = sqlNextRow(sr)) != NULL)
{
uint ipStart = sqlUnsigned(row[0]);
uint ipEnd = sqlUnsigned(row[1]);
if (ipStart <= ip && ipEnd >= ip)
{
defaultNode = sqlSigned(row[2]);
}
}
sqlFreeResult(&sr);
fprintf(stderr, "GALT thisNodeStr=%s thisNode=%d ipStr=%s ip=%u defaultNode (for user) %d\n",
thisNodeStr, thisNode,
ipStr, ip, defaultNode); fflush(stderr); // DEBUG REMOVE
// get location of redirect node
if (thisNode != defaultNode)
{
safef(query, sizeof query, "select domain from gbNode where node = %d", defaultNode);
char *newDomain = sqlQuickString(centralConn, query);
fprintf(stderr, "GALT newDomain=%s\n", newDomain); fflush(stderr); // DEBUG REMOVE
char *oldDomain = cgiServerName();
char *port = cgiServerPort();
char *uri = cgiRequestUri();
char *sep = strchr(uri, '?') ? "&" : "?";
int newUriSize = strlen(uri) + 1024;
char *newUri = needMem(newUriSize);
// TODO what about https?
safef(newUri, newUriSize, "http://%s:%s%s%sredirect=auto&source=%s", newDomain, port, uri, sep, oldDomain);
struct dyString *dy = dyStringNew(256);
dyStringPrintf(dy,
"HTTP/1.1 302 found: \n"
"Content-Type: text/html; charset=iso-8859-1\n"
"Connection: close\n"
"Location: %s\n"
"\n"
"Redirecting to closer site\n"
"%s\n"
, newUri , newUri, newUri);
fprintf(stderr, "GALT redirect response:\n%s", dy->string); fflush(stderr); // DEBUG REMOVE
puts(dyStringContents(dy));
exit(0);
}
hDisconnectCentral(¢ralConn);
}
}
}
+char *excludeVars[] = {NULL};
+
+int main(int argc, char *argv[])
+/* Process command line. */
+{
+oldVars = hashNew(10);
+cgiSpoof(&argc, argv);
+
+if(cgiIsOnWeb())
+ checkForGeoMirrorRedirect();
+
cartEmptyShell(doMiddle, hUserCookie(), excludeVars, oldVars);
return 0;
}