Begin adding support for XDR requests

This commit is contained in:
Kegan Myers 2014-04-11 13:51:54 -05:00
parent 19fbcfff3a
commit 4df82a0507
10 changed files with 241 additions and 94 deletions

20
build/typertext.d.ts vendored
View file

@ -139,3 +139,23 @@ declare module Typertext.Json {
interface JsonResponseHandler extends GenericResponseHandler<JsonResponse> {
}
}
declare module Typertext.Transport {
interface GenericTransport {
RawRequest(method: Http.HttpMethod, request: Http.HttpUrl, postData: Http.HttpPostData, callback: Http.HttpResponseHandler): void;
}
}
declare module Typertext.Transport {
class TransportChooser {
static GetTransport(method: Http.HttpMethod, request: Http.HttpUrl): GenericTransport;
}
}
declare module Typertext.Transport {
class XDR implements GenericTransport {
public RawRequest(method: Http.HttpMethod, request: Http.HttpUrl, postData?: Http.HttpPostData, callback?: Http.HttpResponseHandler): void;
}
}
declare module Typertext.Transport {
class XHR implements GenericTransport {
public RawRequest(method: Http.HttpMethod, request: Http.HttpUrl, postData?: Http.HttpPostData, callback?: Http.HttpResponseHandler): void;
}
}

View file

@ -117,44 +117,7 @@ var Typertext;
if (typeof postData === "undefined") { postData = {}; }
if (typeof callback === "undefined") { callback = function (c) {
}; }
var noop = function (i) {
return "";
};
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
var getHeader = function (name) {
return xhr.getResponseHeader(name);
};
if (xhr.status == 200) {
callback(new Typertext.Http.HttpResponse(0 /* success */, getHeader, xhr.status, xhr.responseText));
} else if (xhr.status >= 400 && xhr.status < 500) {
callback(new Typertext.Http.HttpResponse(2 /* clientError */, getHeader, xhr.status, xhr.responseText));
} else if (xhr.status >= 500 && xhr.status < 600) {
callback(new Typertext.Http.HttpResponse(1 /* serverError */, getHeader, xhr.status, xhr.responseText));
} else {
callback(new Typertext.Http.HttpResponse(4 /* unknownError */, getHeader, xhr.status, xhr.responseText));
}
}
};
xhr.ontimeout = function () {
callback(new Typertext.Http.HttpResponse(5 /* timeout */, noop, -1, ""));
};
xhr.open(Typertext.Http.HttpMethod[method], request.ToString(), true);
if (method == 0 /* GET */) {
xhr.send();
return;
}
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(Typertext.Http.HttpUrl.UrlEncodeObject(postData));
Typertext.Transport.TransportChooser.GetTransport(method, request).RawRequest(method, request, postData, callback);
};
return HttpRequest;
})();
@ -388,4 +351,113 @@ var Typertext;
})(Typertext.Json || (Typertext.Json = {}));
var Json = Typertext.Json;
})(Typertext || (Typertext = {}));
var Typertext;
(function (Typertext) {
(function (Transport) {
})(Typertext.Transport || (Typertext.Transport = {}));
var Transport = Typertext.Transport;
})(Typertext || (Typertext = {}));
var Typertext;
(function (Typertext) {
(function (Transport) {
var TransportChooser = (function () {
function TransportChooser() {
}
TransportChooser.GetTransport = function (method, request) {
var ieLte9 = false;
var isXdomain = false;
var isXprotocol = false;
if (!ieLte9) {
return new Typertext.Transport.XDR();
} else if (isXdomain && !isXprotocol) {
return new Typertext.Transport.XHR();
}
throw {};
};
return TransportChooser;
})();
Transport.TransportChooser = TransportChooser;
})(Typertext.Transport || (Typertext.Transport = {}));
var Transport = Typertext.Transport;
})(Typertext || (Typertext = {}));
var Typertext;
(function (Typertext) {
(function (Transport) {
var XDR = (function () {
function XDR() {
}
XDR.prototype.RawRequest = function (method, request, postData, callback) {
if (typeof postData === "undefined") { postData = {}; }
if (typeof callback === "undefined") { callback = function (c) {
}; }
};
return XDR;
})();
Transport.XDR = XDR;
})(Typertext.Transport || (Typertext.Transport = {}));
var Transport = Typertext.Transport;
})(Typertext || (Typertext = {}));
var Typertext;
(function (Typertext) {
(function (Transport) {
var HttpMethod = Typertext.Http.HttpMethod;
var HttpUrl = Typertext.Http.HttpUrl;
var HttpResponseStatus = Typertext.Http.HttpResponseStatus;
var HttpResponse = Typertext.Http.HttpResponse;
var XHR = (function () {
function XHR() {
}
XHR.prototype.RawRequest = function (method, request, postData, callback) {
if (typeof postData === "undefined") { postData = {}; }
if (typeof callback === "undefined") { callback = function (c) {
}; }
var noop = function (i) {
return "";
};
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
var getHeader = function (name) {
return xhr.getResponseHeader(name);
};
if (xhr.status == 200) {
callback(new HttpResponse(0 /* success */, getHeader, xhr.status, xhr.responseText));
} else if (xhr.status >= 400 && xhr.status < 500) {
callback(new HttpResponse(2 /* clientError */, getHeader, xhr.status, xhr.responseText));
} else if (xhr.status >= 500 && xhr.status < 600) {
callback(new HttpResponse(1 /* serverError */, getHeader, xhr.status, xhr.responseText));
} else {
callback(new HttpResponse(4 /* unknownError */, getHeader, xhr.status, xhr.responseText));
}
}
};
xhr.ontimeout = function () {
callback(new HttpResponse(5 /* timeout */, noop, -1, ""));
};
xhr.open(HttpMethod[method], request.ToString(), true);
if (method == 0 /* GET */) {
xhr.send();
return;
}
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(HttpUrl.UrlEncodeObject(postData));
};
return XHR;
})();
Transport.XHR = XHR;
})(Typertext.Transport || (Typertext.Transport = {}));
var Transport = Typertext.Transport;
})(Typertext || (Typertext = {}));
//# sourceMappingURL=typertext.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -52,59 +52,7 @@ module Typertext.Http {
*/
public RawRequest(method:HttpMethod, request:HttpUrl, postData:HttpPostData = {}, callback:HttpResponseHandler = (c)=> {
}):void {
var noop = (i:string)=>{
return "";
};
//Create a XHR
var xhr = new XMLHttpRequest();
//And let us know when it does something
xhr.onreadystatechange = ()=> {
//If the request is complete
if (xhr.readyState == 4) {
//Prepare a getter for the header
var getHeader = (name:string):string => {
return xhr.getResponseHeader(name);
};
//Check the status
if (xhr.status == 200) {
//And either succeed
callback(new HttpResponse(HttpResponseStatus.success, getHeader, xhr.status, xhr.responseText));
} else if (xhr.status >= 400 && xhr.status < 500) {
//Or fail miserably
callback(new HttpResponse(HttpResponseStatus.clientError, getHeader, xhr.status, xhr.responseText));
} else if (xhr.status >= 500 && xhr.status < 600) {
//Again
callback(new HttpResponse(HttpResponseStatus.serverError, getHeader, xhr.status, xhr.responseText));
} else {
//And again
callback(new HttpResponse(HttpResponseStatus.unknownError, getHeader, xhr.status, xhr.responseText));
}
}
};
//Or if it times out
xhr.ontimeout = () => {
//And make a big deal of the failing
callback(new HttpResponse(HttpResponseStatus.timeout, noop, -1, ""));
};
//Now connect
xhr.open(HttpMethod[method], request.ToString(), true);
//And either send
if (method == HttpMethod.GET) {
//A get request
xhr.send();
return;
}
//Or set the content-type
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//And send the post-data to the server
xhr.send(HttpUrl.UrlEncodeObject(postData));
Typertext.Transport.TransportChooser.GetTransport(method, request).RawRequest(method, request, postData, callback);
}
}
}

View file

@ -0,0 +1,10 @@
module Typertext.Transport {
import HttpMethod = Typertext.Http.HttpMethod;
import HttpUrl = Typertext.Http.HttpUrl;
import HttpPostData = Typertext.Http.HttpPostData;
import HttpResponseHandler = Typertext.Http.HttpResponseHandler;
export interface GenericTransport {
RawRequest(method:HttpMethod, request:HttpUrl, postData:HttpPostData, callback:HttpResponseHandler):void;
}
}

View file

@ -0,0 +1,17 @@
module Typertext.Transport {
export class TransportChooser {
static GetTransport(method:Typertext.Http.HttpMethod, request:Typertext.Http.HttpUrl):GenericTransport {
var ieLte9 = false;
var isXdomain = false;
var isXprotocol = false;
if (!ieLte9) {
return new XDR();
} else if (isXdomain && !isXprotocol) {
return new XHR();
}
throw {};
}
}
}

View file

@ -0,0 +1,13 @@
module Typertext.Transport {
import HttpMethod = Typertext.Http.HttpMethod;
import HttpUrl = Typertext.Http.HttpUrl;
import HttpPostData = Typertext.Http.HttpPostData;
import HttpResponseHandler = Typertext.Http.HttpResponseHandler;
export class XDR implements GenericTransport {
RawRequest(method:HttpMethod, request:HttpUrl, postData:HttpPostData = {}, callback:HttpResponseHandler = (c)=> {
}):void {
}
}
}

View file

@ -0,0 +1,67 @@
module Typertext.Transport {
import HttpMethod = Typertext.Http.HttpMethod;
import HttpUrl = Typertext.Http.HttpUrl;
import HttpPostData = Typertext.Http.HttpPostData;
import HttpResponseHandler = Typertext.Http.HttpResponseHandler;
import HttpResponseStatus = Typertext.Http.HttpResponseStatus;
import HttpResponse = Typertext.Http.HttpResponse;
export class XHR implements GenericTransport {
RawRequest(method:HttpMethod, request:HttpUrl, postData:HttpPostData = {}, callback:HttpResponseHandler = (c)=> {
}):void {
var noop = (i:string)=>{
return "";
};
//Create a XHR
var xhr = new XMLHttpRequest();
//And let us know when it does something
xhr.onreadystatechange = ()=> {
//If the request is complete
if (xhr.readyState == 4) {
//Prepare a getter for the header
var getHeader = (name:string):string => {
return xhr.getResponseHeader(name);
};
//Check the status
if (xhr.status == 200) {
//And either succeed
callback(new HttpResponse(HttpResponseStatus.success, getHeader, xhr.status, xhr.responseText));
} else if (xhr.status >= 400 && xhr.status < 500) {
//Or fail miserably
callback(new HttpResponse(HttpResponseStatus.clientError, getHeader, xhr.status, xhr.responseText));
} else if (xhr.status >= 500 && xhr.status < 600) {
//Again
callback(new HttpResponse(HttpResponseStatus.serverError, getHeader, xhr.status, xhr.responseText));
} else {
//And again
callback(new HttpResponse(HttpResponseStatus.unknownError, getHeader, xhr.status, xhr.responseText));
}
}
};
//Or if it times out
xhr.ontimeout = () => {
//And make a big deal of the failing
callback(new HttpResponse(HttpResponseStatus.timeout, noop, -1, ""));
};
//Now connect
xhr.open(HttpMethod[method], request.ToString(), true);
//And either send
if (method == HttpMethod.GET) {
//A get request
xhr.send();
return;
}
//Or set the content-type
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//And send the post-data to the server
xhr.send(HttpUrl.UrlEncodeObject(postData));
}
}
}