User:Darien Caldwell/HTTP-DNS
Dynamic DNS service for HTTP-IN via Google App Engine:
Once it's installed you can start using it:
- http://yourappname.appspot.com/?type=add&name=[NAME]&url=[URL]
Adds a new service named [NAME] with the HTTP-IN url [URL]. The URL must be converted to a string using llEscapeURL() first.
if the URL is added, returns the response 'Added', or 'Found' if the service already exists.
Removes the given service named [NAME].
Returns 'Removed' if successful, or 'None' if the service wasn't found.
- http://yourappname.appspot.com/?type=update&name=[NAME]&url=[URL]
Updates the service named [NAME] with the HTTP-IN url [URL].
The URL must be converted to a string using llEscapeURL() first. If the URL is updated the response 'Updated' is returned. If the service doesn't exist, a new service is added and 'Added' is returned.
Retrieves the url of the given service named [NAME].
Returns the URL if the service is found, or 'None' if the service wasn't found. the returned URL must be converted to a URL using llUnescapeURL()
Lists the available services currently stored.
Returns a Comma seperated list of service names, ending with the word 'END'.if no services are defined, 'Empty' is returned.
Using the DNS URL
Once a service has been entered, you can use the serivce name in the URL to do automatic redirection.
Example:
You establish a service named 'intro1'
The URL for the service is: http://sim3015.aditi.lindenlab.com:12046/cap/3ff4f3f2-ea08-76c1-cef6-a22b4a573a7c
By Navigating to http://yourappname.appspot.com/intro1 The page will be automatically redirected to the service URL:
http://sim3015.aditi.lindenlab.com:12046/cap/3ff4f3f2-ea08-76c1-cef6-a22b4a573a7c
If the service name used in the URL is invalid, 'None' is returned.<lsl>
string url = ""; string service_name = "my_service"; key URL_KEY;
setup()
{
llReleaseURL(url); URL_KEY=llRequestURL();
}
default {
state_entry()
{
llSetObjectName("HTTP Server");
setup();
}
on_rez(integer n)
{
setup();
}
changed(integer c)
{
if (c & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT) )
{
setup();
}
}
//Response to our HTTPRequest
http_response(key id, integer status, list meta, string body)
{
if (status == 415) // The remote server did reply to your request but the Content-Type of the reply (such as XML, JSON, Atom, RSS, PLS)
// is not recognised by the LL server and so is not passed back to the script.
// You can assume that 415 means the server heard your request and did reply.
{
llInstantMessage(llGetOwner(),"Special Error Status 415 Encountered.");
return;
}
else if (status == 499) // Besides the usual HTTP status codes, SL implements a special status code 499.
// This code isn't generated by the remote web server but by SL's servers, it can indicate:
// Request timeout (60 seconds) -- SSL failure -- A space was present in the url (escape your URL with llEscapeURL).
{
llInstantMessage(llGetOwner(),"Special Error Status 499 Encountered.");
return;
}
else if (status == 502) // The proxy server received an invalid response from an upstream server.
// This error occurs when you send an llHTTPRequest to an object in-world, and it does not reply with an llHTTPResponse.
{
llInstantMessage(llGetOwner(),"Special Error Status 502 Encountered.");
return;
}
if (body=="Updated") llOwnerSay("DNS updated with Server Address.");
else llOwnerSay("Response code:"+(string)status+" Body:"+body); // Some other arbitrary response
}
http_request(key id, string method, string body)
{
if (id==URL_KEY)
{
if (method == URL_REQUEST_GRANTED)
{
url = body;
llHTTPRequest("http://yourappname.appspot.com/?type=add&name=" + service_name + "&url=" + llEscapeURL(url),[],"");
}
else
{
url="";
llOwnerSay("Error: HTTP-IN URL Request Denied.");
}
}
else
{
// Some other Request
llOwnerSay("Got:"+body);
string pathInfoHeader = llGetHTTPHeader(id, "x-path-info");
llOwnerSay("Path:"+pathInfoHeader);
string query = llGetHTTPHeader(id, "x-query-string");
llOwnerSay("Query:"+query);
}
// should always respond to prevent timeouts.
llHTTPResponse(id,200,"ACK");
}
} </lsl>