diff --git a/.travis.yaml b/.travis.yaml new file mode 100644 index 0000000..663b27a --- /dev/null +++ b/.travis.yaml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.8 + - 0.10 \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index 8c9c488..2415297 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,7 +1,15 @@ module.exports = function (grunt) { + grunt.loadNpmTasks('grunt-karma'); grunt.loadNpmTasks('grunt-typescript'); grunt.initConfig({ + karma: { + unit: { + configFile: "karma.conf.js", + singleRun: true, + browsers: ['PhantomJS'] + } + }, typescript: { base: { src: ["lib/**/*.ts"], @@ -15,4 +23,6 @@ module.exports = function (grunt) { }); grunt.registerTask('default', ['typescript']); + + grunt.registerTask('test', ['typescript', 'karma:unit']) }; \ No newline at end of file diff --git a/build/typertext.d.ts b/build/typertext.d.ts index 9ff9a20..57234ad 100644 --- a/build/typertext.d.ts +++ b/build/typertext.d.ts @@ -22,10 +22,10 @@ declare module Typertext { private headers; private httpStatus; private content; - constructor(status: Http.HttpResponseStatus, responseHeaders?: Http.HttpHeaderData, httpResponseCode?: number, responseBody?: T); + constructor(status: Http.HttpResponseStatus, responseHeaderGetter?: (input: string) => string, httpResponseCode?: number, responseBody?: T); public GetContent(): T; public GetContentType(): string; - public GetHeaders(): Http.HttpHeaderData; + public GetHeader(name: string): string; public GetHttpStatus(): number; public GetStatus(): Http.HttpResponseStatus; } @@ -39,11 +39,6 @@ declare module Typertext.Http { class HttpException extends BaseException { } } -declare module Typertext.Http { - interface HttpHeaderData { - [index: string]: string; - } -} declare module Typertext.Http { enum HttpMethod { GET = 0, @@ -68,7 +63,6 @@ declare module Typertext.Http { } declare module Typertext.Http { class HttpRequest implements GenericRequest { - private static parseHeaderString(headerStr); constructor(); public Get(request: HttpUrl, callback: HttpResponseHandler): void; public Post(request: HttpUrl, postData: HttpPostData, callback: HttpResponseHandler): void; @@ -77,7 +71,7 @@ declare module Typertext.Http { } declare module Typertext.Http { class HttpResponse extends GenericResponse { - constructor(status: HttpResponseStatus, responseHeaders?: HttpHeaderData, httpResponseCode?: number, responseBody?: string); + constructor(status: HttpResponseStatus, responseHeaderGetter?: (input: string) => string, httpResponseCode?: number, responseBody?: string); } } declare module Typertext.Http { @@ -135,7 +129,7 @@ declare module Typertext.Json { declare module Typertext.Json { class JsonResponse extends GenericResponse { static fromHttpResponse(httpResponse: Http.HttpResponse): JsonResponse; - constructor(status: Http.HttpResponseStatus, responseHeaders?: Http.HttpHeaderData, httpResponseCode?: number, responseBody?: JsonObject); + constructor(status: Http.HttpResponseStatus, responseHeaderGetter?: (input: string) => string, httpResponseCode?: number, responseBody?: JsonObject); } } declare module Typertext.Json { diff --git a/build/typertext.js b/build/typertext.js index 652a5a1..4074493 100644 --- a/build/typertext.js +++ b/build/typertext.js @@ -28,9 +28,9 @@ var Typertext; var Typertext; (function (Typertext) { var GenericResponse = (function () { - function GenericResponse(status, responseHeaders, httpResponseCode, responseBody) { + function GenericResponse(status, responseHeaderGetter, httpResponseCode, responseBody) { this.status = status; - this.headers = responseHeaders; + this.headers = responseHeaderGetter; this.httpStatus = httpResponseCode; this.content = responseBody; } @@ -39,11 +39,11 @@ var Typertext; }; GenericResponse.prototype.GetContentType = function () { - return this.GetHeaders()["Content-Type"]; + return this.GetHeader("Content-Type"); }; - GenericResponse.prototype.GetHeaders = function () { - return this.headers; + GenericResponse.prototype.GetHeader = function (name) { + return this.headers(name); }; GenericResponse.prototype.GetHttpStatus = function () { @@ -105,18 +105,6 @@ var Typertext; var HttpRequest = (function () { function HttpRequest() { } - HttpRequest.parseHeaderString = function (headerStr) { - var headers = {}, headerPairs = headerStr.split('\u000d\u000a'); - for (var i = 0; i < headerPairs.length; i++) { - var headerPair = headerPairs[i], index = headerPair.indexOf('\u003a\u0020'); - if (index > 0) { - var key = headerPair.substring(0, index); - headers[key] = headerPair.substring(index + 2); - } - } - return headers; - }; - HttpRequest.prototype.Get = function (request, callback) { this.RawRequest(0 /* GET */, request, {}, callback); }; @@ -132,9 +120,11 @@ var Typertext; var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { - var headers = HttpRequest.parseHeaderString(xhr.getAllResponseHeaders()); + var getHeader = function (name) { + return xhr.getResponseHeader(name); + }; if (xhr.status == 200) { - callback(new Typertext.Http.HttpResponse(0 /* success */, headers, xhr.status, xhr.responseText)); + callback(new Typertext.Http.HttpResponse(0 /* success */, getHeader, xhr.status, xhr.responseText)); } else if (xhr.status >= 400 && xhr.status < 500) { throw new Typertext.Http.HttpException("Error type is unimplemented", -1, 2 /* clientError */); } else if (xhr.status >= 500 && xhr.status < 600) { @@ -170,8 +160,8 @@ var Typertext; (function (Http) { var HttpResponse = (function (_super) { __extends(HttpResponse, _super); - function HttpResponse(status, responseHeaders, httpResponseCode, responseBody) { - _super.call(this, status, responseHeaders, httpResponseCode, responseBody); + function HttpResponse(status, responseHeaderGetter, httpResponseCode, responseBody) { + _super.call(this, status, responseHeaderGetter, httpResponseCode, responseBody); } return HttpResponse; })(Typertext.GenericResponse); @@ -218,18 +208,25 @@ var Typertext; this.port = port; } HttpUrl.DefaultPort = function (protocol) { - return ((protocol == 0 /* http */) ? 80 : 443); + switch (protocol) { + case 0 /* http */: + return 80; + case 1 /* https */: + return 443; + default: + return -1; + } }; HttpUrl.FromUrl = function (location) { var l = document.createElement("a"); l.href = location; - return new HttpUrl(l.hostname, Typertext.Http.HttpProtocol[l.protocol], l.pathname, HttpUrl.DecodeQueryString(l.search)); + return new HttpUrl(l.hostname, Typertext.Http.HttpProtocol[l.protocol.slice(0, -1)], l.pathname, HttpUrl.DecodeQueryString(l.search), parseInt(l.port)); }; HttpUrl.DecodeQueryString = function (queryString) { - if (queryString.length == 0 || queryString == "?") { - return {}; + if (queryString.indexOf("?") == 0) { + queryString = queryString.substring(1); } return HttpUrl.UrlDecodeString(queryString); @@ -254,20 +251,25 @@ var Typertext; HttpUrl.UrlDecodeString = function (queryString) { var returnValue = {}, params = HttpUrl.splitString(queryString, "&"); for (var i = 0; i < params.length; i++) { - var param = HttpUrl.splitString(params[i], "=", 2); - if (param.length == 1) { - returnValue[param[0]] = ""; + if (params[i] == "") { continue; } - returnValue[param[0]] = param[1]; + var param = HttpUrl.splitString(params[i], "=", 2); + var key = decodeURIComponent(param[0]); + if (param.length == 1) { + returnValue[key] = ""; + continue; + } + + returnValue[key] = decodeURIComponent(param[1]); } return returnValue; }; HttpUrl.splitString = function (input, separator, limit) { - if (typeof limit === "undefined") { limit = 0; } + if (typeof limit === "undefined") { limit = -1; } limit++; var chunks = input.split(separator); if (limit > 0 && chunks.length > limit) { @@ -352,11 +354,11 @@ var Typertext; (function (Json) { var JsonResponse = (function (_super) { __extends(JsonResponse, _super); - function JsonResponse(status, responseHeaders, httpResponseCode, responseBody) { - _super.call(this, status, responseHeaders, httpResponseCode, responseBody); + function JsonResponse(status, responseHeaderGetter, httpResponseCode, responseBody) { + _super.call(this, status, responseHeaderGetter, httpResponseCode, responseBody); } JsonResponse.fromHttpResponse = function (httpResponse) { - return new JsonResponse(httpResponse.GetStatus(), httpResponse.GetHeaders(), httpResponse.GetHttpStatus(), window["JSON"].parse(httpResponse.GetContent())); + return new JsonResponse(httpResponse.GetStatus(), httpResponse.GetHeader, httpResponse.GetHttpStatus(), window["JSON"].parse(httpResponse.GetContent())); }; return JsonResponse; })(Typertext.GenericResponse); diff --git a/build/typertext.js.map b/build/typertext.js.map index f890076..0fc0114 100644 --- a/build/typertext.js.map +++ b/build/typertext.js.map @@ -1 +1 @@ -{"version":3,"file":"typertext.js","sourceRoot":"","sources":["../lib/Typertext/BaseException.ts","../lib/Typertext/GenericRequest.ts","../lib/Typertext/GenericResponse.ts","../lib/Typertext/GenericResponseHandler.ts","../lib/Typertext/Http/HttpException.ts","../lib/Typertext/Http/HttpHeaderData.ts","../lib/Typertext/Http/HttpMethod.ts","../lib/Typertext/Http/HttpPostData.ts","../lib/Typertext/Http/HttpProtocol.ts","../lib/Typertext/Http/HttpQueryString.ts","../lib/Typertext/Http/HttpRequest.ts","../lib/Typertext/Http/HttpResponse.ts","../lib/Typertext/Http/HttpResponseHandler.ts","../lib/Typertext/Http/HttpResponseStatus.ts","../lib/Typertext/Http/HttpUrl.ts","../lib/Typertext/Json/JsonException.ts","../lib/Typertext/Json/JsonObject.ts","../lib/Typertext/Json/JsonRequest.ts","../lib/Typertext/Json/JsonResponse.ts","../lib/Typertext/Json/JsonResponseHandler.ts"],"names":["Typertext","Typertext.BaseException","Typertext.BaseException.constructor","Typertext.BaseException.GetCode","Typertext.BaseException.GetMessage","Typertext.BaseException.GetCustom","Typertext.GenericResponse","Typertext.GenericResponse.constructor","Typertext.GenericResponse.GetContent","Typertext.GenericResponse.GetContentType","Typertext.GenericResponse.GetHeaders","Typertext.GenericResponse.GetHttpStatus","Typertext.GenericResponse.GetStatus","Typertext.Http","Typertext.Http.HttpException","Typertext.Http.HttpException.constructor","Typertext.Http.HttpMethod","Typertext.Http.HttpProtocol","Typertext.Http.HttpRequest","Typertext.Http.HttpRequest.constructor","Typertext.Http.HttpRequest.parseHeaderString","Typertext.Http.HttpRequest.Get","Typertext.Http.HttpRequest.Post","Typertext.Http.HttpRequest.RawRequest","Typertext.Http.HttpResponse","Typertext.Http.HttpResponse.constructor","Typertext.Http.HttpResponseStatus","Typertext.Http.HttpUrl","Typertext.Http.HttpUrl.constructor","Typertext.Http.HttpUrl.DefaultPort","Typertext.Http.HttpUrl.FromUrl","Typertext.Http.HttpUrl.DecodeQueryString","Typertext.Http.HttpUrl.EncodeQueryString","Typertext.Http.HttpUrl.UrlEncodeObject","Typertext.Http.HttpUrl.UrlDecodeString","Typertext.Http.HttpUrl.splitString","Typertext.Http.HttpUrl.ToString","Typertext.Json","Typertext.Json.JsonException","Typertext.Json.JsonException.constructor","Typertext.Json.JsonRequest","Typertext.Json.JsonRequest.constructor","Typertext.Json.JsonRequest.Get","Typertext.Json.JsonRequest.Post","Typertext.Json.JsonRequest.RawRequest","Typertext.Json.JsonResponse","Typertext.Json.JsonResponse.constructor","Typertext.Json.JsonResponse.fromHttpResponse"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"typertext.js","sourceRoot":"","sources":["../lib/Typertext/BaseException.ts","../lib/Typertext/GenericRequest.ts","../lib/Typertext/GenericResponse.ts","../lib/Typertext/GenericResponseHandler.ts","../lib/Typertext/Http/HttpException.ts","../lib/Typertext/Http/HttpMethod.ts","../lib/Typertext/Http/HttpPostData.ts","../lib/Typertext/Http/HttpProtocol.ts","../lib/Typertext/Http/HttpQueryString.ts","../lib/Typertext/Http/HttpRequest.ts","../lib/Typertext/Http/HttpResponse.ts","../lib/Typertext/Http/HttpResponseHandler.ts","../lib/Typertext/Http/HttpResponseStatus.ts","../lib/Typertext/Http/HttpUrl.ts","../lib/Typertext/Json/JsonException.ts","../lib/Typertext/Json/JsonObject.ts","../lib/Typertext/Json/JsonRequest.ts","../lib/Typertext/Json/JsonResponse.ts","../lib/Typertext/Json/JsonResponseHandler.ts"],"names":["Typertext","Typertext.BaseException","Typertext.BaseException.constructor","Typertext.BaseException.GetCode","Typertext.BaseException.GetMessage","Typertext.BaseException.GetCustom","Typertext.GenericResponse","Typertext.GenericResponse.constructor","Typertext.GenericResponse.GetContent","Typertext.GenericResponse.GetContentType","Typertext.GenericResponse.GetHeader","Typertext.GenericResponse.GetHttpStatus","Typertext.GenericResponse.GetStatus","Typertext.Http","Typertext.Http.HttpException","Typertext.Http.HttpException.constructor","Typertext.Http.HttpMethod","Typertext.Http.HttpProtocol","Typertext.Http.HttpRequest","Typertext.Http.HttpRequest.constructor","Typertext.Http.HttpRequest.Get","Typertext.Http.HttpRequest.Post","Typertext.Http.HttpRequest.RawRequest","Typertext.Http.HttpResponse","Typertext.Http.HttpResponse.constructor","Typertext.Http.HttpResponseStatus","Typertext.Http.HttpUrl","Typertext.Http.HttpUrl.constructor","Typertext.Http.HttpUrl.DefaultPort","Typertext.Http.HttpUrl.FromUrl","Typertext.Http.HttpUrl.DecodeQueryString","Typertext.Http.HttpUrl.EncodeQueryString","Typertext.Http.HttpUrl.UrlEncodeObject","Typertext.Http.HttpUrl.UrlDecodeString","Typertext.Http.HttpUrl.splitString","Typertext.Http.HttpUrl.ToString","Typertext.Json","Typertext.Json.JsonException","Typertext.Json.JsonException.constructor","Typertext.Json.JsonRequest","Typertext.Json.JsonRequest.constructor","Typertext.Json.JsonRequest.Get","Typertext.Json.JsonRequest.Post","Typertext.Json.JsonRequest.RawRequest","Typertext.Json.JsonResponse","Typertext.Json.JsonResponse.constructor","Typertext.Json.JsonResponse.fromHttpResponse"],"mappings":"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"} \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..e9ad339 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,10 @@ +module.exports = function (config) { + config.set({ + basePath: __dirname, + frameworks: ['jasmine'], + files: [ + 'test/**/*.test.js', + 'build/typertext.js' + ] + }); +}; \ No newline at end of file diff --git a/lib/Typertext/GenericResponse.ts b/lib/Typertext/GenericResponse.ts index 42bed9c..039830f 100644 --- a/lib/Typertext/GenericResponse.ts +++ b/lib/Typertext/GenericResponse.ts @@ -4,12 +4,11 @@ * @submodule Json */ module Typertext { - import HttpHeaderData = Typertext.Http.HttpHeaderData; import HttpResponseStatus = Typertext.Http.HttpResponseStatus; export class GenericResponse { private status:HttpResponseStatus; - private headers:HttpHeaderData; + private headers:(input:string)=>string; private httpStatus:number; private content:T; @@ -21,7 +20,7 @@ module Typertext { * @uses Typertext.Http.HttpResponseStatus * * @param {HttpResponseStatus} status - * @param {HttpHeaderData} responseHeaders + * @param {Function} responseHeaderGetter * @param {number} httpResponseCode * @param {T} responseBody * @constructor @@ -29,9 +28,9 @@ module Typertext { * @author Kegan Myers * @version 0.3.0 */ - constructor(status:HttpResponseStatus, responseHeaders?:HttpHeaderData, httpResponseCode?:number, responseBody?:T) { + constructor(status:HttpResponseStatus, responseHeaderGetter?:(input:string)=>string, httpResponseCode?:number, responseBody?:T) { this.status = status; - this.headers = responseHeaders; + this.headers = responseHeaderGetter; this.httpStatus = httpResponseCode; this.content = responseBody; } @@ -52,17 +51,17 @@ module Typertext { * @constructor */ public GetContentType():string { - return this.GetHeaders()["Content-Type"]; + return this.GetHeader("Content-Type"); } /** * Accessor method * - * @returns {HttpHeaderData} + * @returns {string} * @constructor */ - public GetHeaders():HttpHeaderData { - return this.headers; + public GetHeader(name:string):string { + return this.headers(name); } /** diff --git a/lib/Typertext/Http/HttpHeaderData.ts b/lib/Typertext/Http/HttpHeaderData.ts deleted file mode 100644 index fa9a6ea..0000000 --- a/lib/Typertext/Http/HttpHeaderData.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @namespace Typertext - * @module Http - */ -module Typertext.Http { - /** - * @interface HttpHeaderData - */ - export interface HttpHeaderData { - [index:string]:string - } -} \ No newline at end of file diff --git a/lib/Typertext/Http/HttpRequest.ts b/lib/Typertext/Http/HttpRequest.ts index a3104ce..59513b2 100644 --- a/lib/Typertext/Http/HttpRequest.ts +++ b/lib/Typertext/Http/HttpRequest.ts @@ -7,26 +7,6 @@ */ module Typertext.Http { export class HttpRequest implements Typertext.GenericRequest { - /** - * A helper method that takes headers sent by the server and parses it out to an object - * - * @param {string} headerStr - * @returns {HttpHeaderData} - */ - private static parseHeaderString(headerStr:string):HttpHeaderData { - var headers:HttpHeaderData = {}, - headerPairs:string[] = headerStr.split('\u000d\u000a'); - for (var i:number = 0; i < headerPairs.length; i++) { - var headerPair:string = headerPairs[i], - index:number = headerPair.indexOf('\u003a\u0020'); - if (index > 0) { - var key:string = headerPair.substring(0, index); - headers[key] = headerPair.substring(index + 2); - } - } - return headers; - } - /** * The class that everything that calls an http(s) server should use and build on top of using callbacks * @@ -76,9 +56,11 @@ module Typertext.Http { xhr.onreadystatechange = ()=> { //Once the request completes if (xhr.readyState == 4) { - var headers:HttpHeaderData = HttpRequest.parseHeaderString(xhr.getAllResponseHeaders()); + var getHeader = (name:string):string => { + return xhr.getResponseHeader(name); + }; if (xhr.status == 200) { - callback(new HttpResponse(HttpResponseStatus.success, headers, xhr.status, xhr.responseText)); + callback(new HttpResponse(HttpResponseStatus.success, getHeader, xhr.status, xhr.responseText)); } else if (xhr.status >= 400 && xhr.status < 500) { //TODO generate a client error callback diff --git a/lib/Typertext/Http/HttpResponse.ts b/lib/Typertext/Http/HttpResponse.ts index 177abcc..3e928b1 100644 --- a/lib/Typertext/Http/HttpResponse.ts +++ b/lib/Typertext/Http/HttpResponse.ts @@ -11,7 +11,7 @@ module Typertext.Http { * @extends GenericResponse * * @param {HttpResponseStatus} status - * @param {HttpHeaderData} responseHeaders + * @param {Function} responseHeaderGetter * @param {number} httpResponseCode * @param {string} responseBody * @@ -19,8 +19,8 @@ module Typertext.Http { * @version 0.3.0 * @constructor */ - constructor(status:HttpResponseStatus, responseHeaders?:HttpHeaderData, httpResponseCode?:number, responseBody?:string) { - super(status, responseHeaders, httpResponseCode, responseBody); + constructor(status:HttpResponseStatus, responseHeaderGetter?:(input:string)=>string, httpResponseCode?:number, responseBody?:string) { + super(status, responseHeaderGetter, httpResponseCode, responseBody); } } } \ No newline at end of file diff --git a/lib/Typertext/Http/HttpUrl.ts b/lib/Typertext/Http/HttpUrl.ts index e91d9e6..06bf2aa 100644 --- a/lib/Typertext/Http/HttpUrl.ts +++ b/lib/Typertext/Http/HttpUrl.ts @@ -8,9 +8,7 @@ module Typertext.Http { private path:string; private port:number; private protocol:HttpProtocol; - private queryString:{ - [index:string]:string - }; + private queryString:HttpQueryString; /** * @@ -18,7 +16,14 @@ module Typertext.Http { * @returns {number} */ public static DefaultPort(protocol:HttpProtocol) { - return ((protocol == HttpProtocol.http) ? 80 : 443) + switch(protocol) { + case HttpProtocol.http: + return 80; + case HttpProtocol.https: + return 443; + default: + return -1; + } } /** @@ -30,7 +35,7 @@ module Typertext.Http { public static FromUrl(location:string):HttpUrl { var l = document.createElement("a"); l.href = location; - return new HttpUrl(l.hostname, HttpProtocol[l.protocol], l.pathname, HttpUrl.DecodeQueryString(l.search)) + return new HttpUrl(l.hostname, HttpProtocol[l.protocol.slice(0,-1)], l.pathname, HttpUrl.DecodeQueryString(l.search), parseInt(l.port)) } /** @@ -40,8 +45,8 @@ module Typertext.Http { * @returns {HttpQueryString} */ public static DecodeQueryString(queryString:string):HttpQueryString { - if (queryString.length == 0 || queryString == "?") { - return {}; + if (queryString.indexOf("?") == 0) { + queryString = queryString.substring(1); } return HttpUrl.UrlDecodeString(queryString); @@ -84,13 +89,18 @@ module Typertext.Http { public static UrlDecodeString(queryString:string):HttpQueryString { var returnValue:HttpQueryString = {}, params:string[] = HttpUrl.splitString(queryString, "&"); for (var i:number = 0; i < params.length; i++) { - var param = HttpUrl.splitString(params[i], "=", 2); - if (param.length == 1) { - returnValue[param[0]] = ""; + if (params[i] == "") { continue; } - returnValue[param[0]] = param[1]; + var param = HttpUrl.splitString(params[i], "=", 2); + var key = decodeURIComponent(param[0]); + if (param.length == 1) { + returnValue[key] = ""; + continue; + } + + returnValue[key] = decodeURIComponent(param[1]); } return returnValue; @@ -105,7 +115,7 @@ module Typertext.Http { * @param {number} limit * @returns {string[]} */ - private static splitString(input:string, separator:string, limit:number = 0):string[] { + private static splitString(input:string, separator:string, limit:number = -1):string[] { limit++; var chunks:string[] = input.split(separator); if (limit > 0 && chunks.length > limit) { diff --git a/lib/Typertext/Json/JsonResponse.ts b/lib/Typertext/Json/JsonResponse.ts index 5e72891..512ded2 100644 --- a/lib/Typertext/Json/JsonResponse.ts +++ b/lib/Typertext/Json/JsonResponse.ts @@ -5,7 +5,6 @@ module Typertext.Json { import HttpResponse = Typertext.Http.HttpResponse; import HttpResponseStatus = Typertext.Http.HttpResponseStatus; - import HttpHeaderData = Typertext.Http.HttpHeaderData; export class JsonResponse extends Typertext.GenericResponse { @@ -16,7 +15,7 @@ module Typertext.Json { * @returns {JsonResponse} */ public static fromHttpResponse(httpResponse:HttpResponse):JsonResponse { - return new JsonResponse(httpResponse.GetStatus(), httpResponse.GetHeaders(), httpResponse.GetHttpStatus(), window["JSON"].parse(httpResponse.GetContent())); + return new JsonResponse(httpResponse.GetStatus(), httpResponse.GetHeader, httpResponse.GetHttpStatus(), window["JSON"].parse(httpResponse.GetContent())); } /** @@ -31,8 +30,8 @@ module Typertext.Json { * @author Kegan Myers * @version 0.3.0 */ - constructor(status:HttpResponseStatus, responseHeaders?:HttpHeaderData, httpResponseCode?:number, responseBody?:JsonObject) { - super(status, responseHeaders, httpResponseCode, responseBody); + constructor(status:HttpResponseStatus, responseHeaderGetter?:(input:string)=>string, httpResponseCode?:number, responseBody?:JsonObject) { + super(status, responseHeaderGetter, httpResponseCode, responseBody); } } } \ No newline at end of file diff --git a/package.json b/package.json index e755e8c..13f873d 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,29 @@ { - "name": "Typertext", - "description": "A simple TypeScript HTTP request library", - "repository" : { - "type" : "git", - "url" : "https://github.com/terribleplan/Typertext.git" - }, - "version": "0.3.1", - "devDependencies": { - "grunt": "~0.4.2", - "grunt-typescript": "~0.2.7" - }, - "license": "MIT" + "name": "Typertext", + "description": "A simple TypeScript HTTP request library", + "repository": { + "type": "git", + "url": "https://github.com/terribleplan/Typertext.git" + }, + "version": "0.3.1", + "devDependencies": { + "grunt": "~0.4.2", + "grunt-typescript": "~0.2.7", + "karma-script-launcher": "~0.1.0", + "karma-chrome-launcher": "~0.1.2", + "karma-firefox-launcher": "~0.1.3", + "karma-html2js-preprocessor": "~0.1.0", + "karma-jasmine": "~0.1.5", + "karma-coffee-preprocessor": "~0.1.3", + "requirejs": "~2.1.11", + "karma-requirejs": "~0.2.1", + "karma-phantomjs-launcher": "~0.1.2", + "karma": "~0.10.9", + "grunt-karma": "~0.6.2", + "phantomjs": "~1.9.7-1" + }, + "license": "MIT", + "scripts": { + "test": "./node_modules/.bin/karma start karma.conf.js --single-run" + } } diff --git a/test/Typertext/Http/HttpRequest.test.js b/test/Typertext/Http/HttpRequest.test.js new file mode 100644 index 0000000..285de2c --- /dev/null +++ b/test/Typertext/Http/HttpRequest.test.js @@ -0,0 +1,5 @@ +describe("Typertext.Http.HttpRequest", function() { + it("Exists", function() { + expect(typeof Typertext.Http.HttpRequest).toBe("function"); + }); +}); \ No newline at end of file diff --git a/test/Typertext/Http/HttpUrl.test.js b/test/Typertext/Http/HttpUrl.test.js new file mode 100644 index 0000000..3d300fe --- /dev/null +++ b/test/Typertext/Http/HttpUrl.test.js @@ -0,0 +1,256 @@ +describe("Typertext.Http.HttpUrl", function () { + it("exists", function () { + expect(typeof Typertext.Http.HttpUrl).toBe("function"); + }); + + describe("DefaultPort", function () { + it("exists", function () { + expect(typeof Typertext.Http.HttpUrl.DefaultPort).toBe("function"); + }); + it("returns the correct default port for http", function () { + var input = Typertext.Http.HttpProtocol.http, + expectedOutput = 80, + actualOutput = Typertext.Http.HttpUrl.DefaultPort(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + it("returns the correct default port for https", function () { + var input = Typertext.Http.HttpProtocol.https, + expectedOutput = 443, + actualOutput = Typertext.Http.HttpUrl.DefaultPort(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + it("returns -1 (an invalid port) for any unrecognized protocol", function () { + var inputs = [67, "", "nonsense", false, [], function () { + }], + expectedOutput = -1; + + for (var i = inputs.length - 1; i >= 0; i--) { + expect(Typertext.Http.HttpUrl.DefaultPort(inputs[i])).toEqual(expectedOutput); + } + }); + }); + + describe("FromUrl", function () { + it("is a function", function () { + expect(typeof Typertext.Http.HttpUrl.FromUrl).toBe("function"); + }); + + it("handles a simple http url", function () { + var input = "http://example.com/", + expectedOutput = new Typertext.Http.HttpUrl("example.com", Typertext.Http.HttpProtocol.http), + actualOutput = Typertext.Http.HttpUrl.FromUrl(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + + it("handles a simple https url", function () { + var input = "https://example.com/", + expectedOutput = new Typertext.Http.HttpUrl("example.com", Typertext.Http.HttpProtocol.https), + actualOutput = Typertext.Http.HttpUrl.FromUrl(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + + it("handles an http url with a path", function () { + var input = "http://example.com/hello", + expectedOutput = new Typertext.Http.HttpUrl("example.com", Typertext.Http.HttpProtocol.http, "/hello"), + actualOutput = Typertext.Http.HttpUrl.FromUrl(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + + it("handles an http url with a path to a file", function () { + var input = "http://example.com/index.html", + expectedOutput = new Typertext.Http.HttpUrl("example.com", Typertext.Http.HttpProtocol.http, "/index.html"), + actualOutput = Typertext.Http.HttpUrl.FromUrl(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + + it("handles an http url with a query", function () { + var input = "http://example.com/?with=query", + expectedOutput = new Typertext.Http.HttpUrl("example.com", Typertext.Http.HttpProtocol.http, "/", {with: "query"}), + actualOutput = Typertext.Http.HttpUrl.FromUrl(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + + it("handles an http url with a port", function () { + var input = "http://example.com:81/", + expectedOutput = new Typertext.Http.HttpUrl("example.com", Typertext.Http.HttpProtocol.http, "/", {}, 81), + actualOutput = Typertext.Http.HttpUrl.FromUrl(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + + it("handles multiple complex urls", function () { + var input = "https://example.com:453/path/to/some.php?with=query", + expectedOutput = new Typertext.Http.HttpUrl("example.com", Typertext.Http.HttpProtocol.https, "/path/to/some.php", {with: "query"}, 453), + actualOutput = Typertext.Http.HttpUrl.FromUrl(input); + expect(actualOutput).toEqual(expectedOutput); + + input = "http://example.com:22/path/thing/?without"; + expectedOutput = new Typertext.Http.HttpUrl("example.com", Typertext.Http.HttpProtocol.http, "/path/thing/", {without: ""}, 22); + actualOutput = Typertext.Http.HttpUrl.FromUrl(input); + expect(actualOutput).toEqual(expectedOutput); + + input = "https://example.com:80/path/thing/.htaccess?version=125&something=else"; + expectedOutput = new Typertext.Http.HttpUrl("example.com", Typertext.Http.HttpProtocol.https, "/path/thing/.htaccess", {version: "125", something: "else"}, 80); + actualOutput = Typertext.Http.HttpUrl.FromUrl(input); + expect(actualOutput).toEqual(expectedOutput); + }); + + + }); + + describe("DecodeQueryString", function () { + it("follows the same spec as DecodeQueryString, but will remove an optional leading '?'", function () { + var input = "?fizz=buzz", + expectedOutput = { + fizz: "buzz" + }, + actualOutput = Typertext.Http.HttpUrl.DecodeQueryString(input); + expect(actualOutput).toEqual(expectedOutput); + input = "fizz=buzz"; + actualOutput = Typertext.Http.HttpUrl.DecodeQueryString(input); + expect(actualOutput).toEqual(expectedOutput); + + input = "?foo=bar&fizz=buzz&your=mom"; + expectedOutput = { + fizz: "buzz", + foo: "bar", + your: "mom" + }; + actualOutput = Typertext.Http.HttpUrl.DecodeQueryString(input); + expect(actualOutput).toEqual(expectedOutput); + input = "foo=bar&fizz=buzz&your=mom"; + actualOutput = Typertext.Http.HttpUrl.DecodeQueryString(input); + expect(actualOutput).toEqual(expectedOutput); + + input = "?foo=bar&fizz=buzz&enc%26me(=o%40u%23T%24"; + expectedOutput = { + "enc&me(": "o@u#T$", + fizz: "buzz", + foo: "bar" + }; + actualOutput = Typertext.Http.HttpUrl.DecodeQueryString(input); + expect(actualOutput).toEqual(expectedOutput); + input = "foo=bar&fizz=buzz&enc%26me(=o%40u%23T%24"; + actualOutput = Typertext.Http.HttpUrl.DecodeQueryString(input); + expect(actualOutput).toEqual(expectedOutput); + }); + }); + + describe("EncodeQueryString", function () { + it("follows the same spec as UrlEncodeObject, but with a prepended '?'", function () { + var input = {}, + expectedOutput = "", + actualOutput = Typertext.Http.HttpUrl.EncodeQueryString(input); + expect(actualOutput).toEqual(expectedOutput); + + input = { + foo: "bar" + }; + expectedOutput = "?foo=bar"; + actualOutput = Typertext.Http.HttpUrl.EncodeQueryString(input); + expect(actualOutput).toEqual(expectedOutput); + + input = { + "enc&me(": "o@u#T$" + }; + expectedOutput = "?enc%26me(=o%40u%23T%24"; + actualOutput = Typertext.Http.HttpUrl.EncodeQueryString(input); + expect(actualOutput).toEqual(expectedOutput); + + input = { + "foo": "bar", + "fizz": "buzz" + }; + expectedOutput = "?foo=bar&fizz=buzz"; + actualOutput = Typertext.Http.HttpUrl.EncodeQueryString(input); + expect(actualOutput).toEqual(expectedOutput); + }); + }); + + describe("UrlEncodeObject", function () { + //TODO + it("encodes an empty object as an empty string", function () { + var input = {}, + expectedOutput = "", + actualOutput = Typertext.Http.HttpUrl.UrlEncodeObject(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + it("encodes an object with one k/v string pair", function () { + var input = { + foo: "bar" + }, + expectedOutput = "foo=bar", + actualOutput = Typertext.Http.HttpUrl.UrlEncodeObject(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + it("encodes an object with one k/v string pair with special characters in both the key and value", function () { + var input = { + "enc&me(": "o@u#T$" + }, + expectedOutput = "enc%26me(=o%40u%23T%24", + actualOutput = Typertext.Http.HttpUrl.UrlEncodeObject(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + it("encodes multiple key/value pairs", function () { + var input = { + "foo": "bar", + "fizz": "buzz" + }, + expectedOutput = "foo=bar&fizz=buzz", + actualOutput = Typertext.Http.HttpUrl.UrlEncodeObject(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + }); + + describe("UrlDecodeObject", function () { + it("decodes an empty string properly", function () { + var input = "", + expectedOutput = {}, + actualOutput = Typertext.Http.HttpUrl.UrlDecodeString(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + it("decodes a single key/value pair", function () { + var input = "fizz=buzz", + expectedOutput = { + fizz: "buzz" + }, + actualOutput = Typertext.Http.HttpUrl.UrlDecodeString(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + it("decodes multiple key/value pairs", function () { + var input = "foo=bar&fizz=buzz&your=mom", + expectedOutput = { + fizz: "buzz", + foo: "bar", + your: "mom" + }, + actualOutput = Typertext.Http.HttpUrl.UrlDecodeString(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + it("decodes key/value pairs with special characters", function () { + var input = "foo=bar&fizz=buzz&enc%26me(=o%40u%23T%24", + expectedOutput = { + "enc&me(": "o@u#T$", + fizz: "buzz", + foo: "bar" + }, + actualOutput = Typertext.Http.HttpUrl.UrlDecodeString(input); + + expect(actualOutput).toEqual(expectedOutput); + }); + }); +}); \ No newline at end of file