{ "id": "154476", "key": "AC-1709", "fields": { "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false }, "project": { "id": "12217", "key": "AC", "name": "Appcelerator - INBOX", "projectCategory": { "id": "10000", "description": "", "name": "Customer Service" } }, "resolution": { "id": "5", "description": "All attempts at reproducing this issue failed, or not enough information was available to reproduce the issue. Reading the code produces no clues as to why this behavior would occur. If more information appears later, please reopen the issue.", "name": "Cannot Reproduce" }, "resolutiondate": "2016-01-31T06:54:40.000+0000", "created": "2016-01-22T06:04:22.000+0000", "labels": [ "HttpClient" ], "versions": [], "issuelinks": [], "assignee": { "name": "shossain", "key": "shossain", "displayName": "Shak Hossain", "active": false, "timeZone": "America/Los_Angeles" }, "updated": "2016-03-08T07:38:12.000+0000", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [ { "id": "14548", "name": "Titanium SDK & CLI", "description": "Please enter tickets related to the MobileSDK here." } ], "description": "HttpClient.send() does not respect the order of the array of data given to it.\r\n\r\nWhen using a pre-authorized POST url for Amazon's AWS S3 the order of the POST fields matters.\r\n\r\nFor instance\r\n\r\n{code:javascript}\r\nvar httpClient = Ti.Network.createHTTPClient({\r\n\t\t\t\t\t\tonload: function(e) {\r\n\t\t\t\t\t\t\tTi.API.info(\"Upload file responseText: \" + this.responseText);\r\n\t\t \t\t\t\t_encodedFilename = awsPolicyFields.formInputs.key;\r\n\t\t callback(true);\r\n\t\t\t\t\t\t},\r\n\t\t\t onerror : function(e) {\r\n\t \t\t\tTi.API.error(\"Error uploading file: \" + e.error);\r\n\t\t\t\t\t\t\tTi.API.debug(\"Upload file responseText: \" + this.responseText);\r\n\t\t\t \tcallback(false);\r\n\t\t\t },\r\n\t\t\t\t\t onsendstream : function(e) { \r\n\t\t\t\t\t var progress = parseFloat(e.progress);\r\n\t\t\t\t\t Ti.API.trace(\"Upload progress: \" + (progress * 100));\r\n\t\t\t\t\t Ti.App.fireEvent('progress_update', {'progress' : progress});\r\n\t\t\t\t\t },\r\n\t\t\t validatesSecureCertificate : _validatesSSL\r\n\t\t\t\t\t});\r\n\t\t\t\t\t\r\n\t\t\t\t\tvar args = {\r\n\t\t\t\t\t\t'key': awsPolicyFields.formInputs['key'],\r\n\t\t\t\t\t\t'policy' : awsPolicyFields.formInputs['policy'],\r\n\t\t\t\t\t\t'signature' : awsPolicyFields.formInputs['signature'],\r\n\t\t\t\t\t\t'AWSAccessKeyId' : awsPolicyFields.formInputs['AWSAccessKeyId'],\r\n\t\t\t\t\t\t'success_action_status' : awsPolicyFields.formInputs['success_action_status'],\r\n\t\t\t\t\t\t'x-amz-server-side-encryption' : awsPolicyFields.formInputs['x-amz-server-side-encryption'],\r\n\t\t\t\t\t\t'Content-Type' : awsPolicyFields.formInputs['Content-Type'],\r\n\t\t\t\t\t\t'file' : videoFile,\r\n\t\t\t\t\t};\r\n\t\t\t\t\t\r\n\t\t\t\t\thttpClient.open(awsPolicyFields.formAttributes.method, awsPolicyFields.formAttributes.action);\r\n\t\t\t\t\thttpClient.send(args);\r\n\t\t\t networkManager.addRequest(httpClient);\r\n{code}\r\n\r\nsent the following request\r\n\r\n{code:txt}\r\n=============== New Request at 2016-01-22T03:02:08+00:00 ===================\r\nPOST /endpoint\r\nx-newrelic-id: XXXXXXXXXXXX=\r\nAccept-Encoding: identity\r\nX-Titanium-Id: XXXXXXXXXXXXXXXXXXXX\r\nContent-Type: multipart/form-data; boundary=j6FN2IMH7hRNiksUXnkOufIDEOdD4CH9jEHbdh\r\nX-Requested-With: XMLHttpRequest\r\nUser-Agent: Appcelerator Titanium/5.1.2 (Android SDK built for x86_64; Android API Level: 22; en-US;)\r\nHost: example.org\r\nConnection: Keep-Alive\r\nContent-Length: 279029\r\n--------------------- php://input -----------------\r\n--------------------- $_POST -----------------\r\nAWSAccessKeyId: XXXXXXXXXXXXX\r\nContent-Type: video/mp4\r\nkey: keydir/XXXXXX/sadfsdaf.mp4\r\nsignature: a+TJ/dJX/ei76vm4EURakrg7q+s=\r\npolicy: eyJleHBpcmF0aW9uIjoiMjAxNi0wMS0yMlQwNDowMTo0NloiLCJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJXXXXXXXXXXXXXXXXXXXXXXvbl9zdGF0dXMiOiIyMDAifSx7ImtleSI6ImRlbW9cL2Z0cF91cGxvYWRzXC84LWdlbmVyYWwtbWFuYWdlclwvc2FkZnNkYWYubXA0In0seyJ4LWXXXXXXXXXXXXXXXXXXXB0aW9uIjoiQUVTMjU2In0seyJDb250ZW50LVR5cGUiOiJ2aWRlb1wvbXA0In1dfQ==\r\nsuccess_action_status: 200\r\nx-amz-server-side-encryption: AES256\r\n--------------------- $_FILE -----------------\r\nfile:\r\narray (\r\n 'name' => 'VID_20160121_220135.mp4',\r\n 'type' => 'application/octet-stream',\r\n 'tmp_name' => '/tmp/phpOI761z',\r\n 'error' => 0,\r\n 'size' => 277413,\r\n)\r\n{code}", "attachment": [], "flagged": false, "summary": "HttpClient.send() changes order of POST values", "creator": { "name": "isleshocky77", "key": "isleshocky77", "displayName": "Stephen Ostrow", "active": true, "timeZone": "America/New_York" }, "subtasks": [], "reporter": { "name": "isleshocky77", "key": "isleshocky77", "displayName": "Stephen Ostrow", "active": true, "timeZone": "America/New_York" }, "environment": "user@user-msi ~ $ appc ti info\r\nAppcelerator Command-Line Interface, version 5.1.0\r\nCopyright (c) 2014-2016, Appcelerator, Inc. All Rights Reserved.\r\n\r\nOperating System\r\n Name = Linux Mint 17.2 Rafaela\r\n Version = 17.2\r\n Architecture = 64bit\r\n # CPUs = 8\r\n Memory = 15.6GB\r\n\r\nNode.js\r\n Node.js Version = 4.2.4\r\n npm Version = 2.14.12\r\n\r\nTitanium CLI\r\n CLI Version = 5.0.5\r\n node-appc Version = 0.2.31\r\n\r\nTitanium SDKs\r\n 5.1.2.GA\r\n Version = 5.1.2\r\n Install Location = /home/user/.titanium/mobilesdk/linux/5.1.2.GA\r\n Platforms = android, mobileweb\r\n git Hash = ca822b2\r\n git Timestamp = 12/16/15 19:00\r\n node-appc Version = 0.2.32\r\n 3.5.1.GA\r\n Version = 3.5.1\r\n Install Location = /home/user/.titanium/mobilesdk/linux/3.5.1.GA\r\n Platforms = mobileweb, android, blackberry\r\n git Hash = 96875c9\r\n git Timestamp = 03/05/15 10:08\r\n node-appc Version = 0.2.24\r\n \r\nIntelĀ® Hardware Accelerated Execution Manager (HAXM)\r\n Not installed\r\n\r\nJava Development Kit\r\n Version = 1.8.0_66\r\n Java Home = /usr/lib/jvm/java-8-oracle\r\n\r\nGenymotion\r\n Path = not found\r\n Genymotion Executable = not found\r\n Genymotion Player = not found\r\n Home = not found\r\n\r\nVirtualBox\r\n Executable = not found\r\n Version = unknown\r\n\r\nAndroid SDK\r\n Android Executable = /home/user/Android/Sdk/tools/android\r\n ADB Executable = /home/user/Android/Sdk/platform-tools/adb\r\n SDK Path = /home/user/Android/Sdk\r\n\r\nAndroid NDK\r\n NDK Path = not found\r\n NDK Version = not found\r\n\r\nAndroid Platforms\r\n 1) android-15\r\n Name = Android 4.0.3 **Not supported by Titanium SDK 5.1.2.GA**\r\n API Level = 15\r\n Revision = 5\r\n Skins = HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800, WVGA854, WXGA720, WXGA800\r\n ABIs = no ABIs.\r\n Path = /home/user/Android/Sdk/platforms/android-15\r\n 2) android-22\r\n Name = Android 5.1.1 **Not supported by Titanium SDK 5.1.2.GA**\r\n API Level = 22\r\n Revision = 2\r\n Skins = HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800, WVGA854, WXGA720, WXGA800, WXGA800-7in\r\n ABIs = x86, x86_64\r\n Path = /home/user/Android/Sdk/platforms/android-22\r\n 3) android-23\r\n Name = Android 6.0\r\n API Level = 23\r\n Revision = 2\r\n Skins = HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800, WVGA854, WXGA720, WXGA800, WXGA800-7in\r\n ABIs = no ABIs.\r\n Path = /home/user/Android/Sdk/platforms/android-23\r\n\r\nAndroid Add-Ons\r\n None\r\n\r\nAndroid Emulators\r\n Nexus_9_API_22\r\n Path = /home/user/.android/avd/Nexus_9_API_22.avd\r\n SDK Version = Android 5.1.1 (API level 22)\r\n ABI = x86_64\r\n Skin = 800x1280\r\n SD Card = /home/user/.android/avd/Nexus_9_API_22.avd/sdcard.img\r\n Google APIs = no\r\n", "comment": { "comments": [ { "id": "375157", "author": { "name": "isleshocky77", "key": "isleshocky77", "displayName": "Stephen Ostrow", "active": true, "timeZone": "America/New_York" }, "body": "I believe this is due to ti.modules.titanium.network.TiHTTPClient using a HashMap for parts\r\n\r\nhttps://github.com/appcelerator/titanium_mobile/blob/master/android/modules/network/src/java/ti/modules/titanium/network/TiHTTPClient.java#L139\r\n\r\nA HashMap does not guarantee ordering and it appears every time you add to it you mach the ordering of it.", "updateAuthor": { "name": "isleshocky77", "key": "isleshocky77", "displayName": "Stephen Ostrow", "active": true, "timeZone": "America/New_York" }, "created": "2016-01-22T17:48:36.000+0000", "updated": "2016-01-22T17:48:36.000+0000" }, { "id": "375347", "author": { "name": "jnaher", "key": "jnaher", "displayName": "Jebun Naher", "active": false, "timeZone": "Asia/Dhaka" }, "body": "Hello,\r\n\r\nI tried to test the ordering of the post data using below code but couldn't reproduce it. It would be helpful if you attach a complete test code and steps to reproduce this issue.\r\n\r\n*Testing Environment:*\r\nAppcelerator Studio, build: 4.4.0.201511241829\r\nAppcelerator Command-Line Interface, version 5.1.0\r\nTitanium Command-Line Interface, CLI version 5.0.5, \r\nTitanium SDK version : 5.1.2 GA\r\nMac OS X : 10.11.1 (EI Capitan)\r\nNode.js Version = 0.12.7\r\nJava Development Kit= 1.7.0_65\r\nVirtualBox Version = 4.3.28r100309\r\n\r\n*Test Code:*\r\nindex.xml\r\n{code}\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n{code}\r\n\r\nindex.js\r\n{code}\r\n$.todoWin.open();\r\nfunction postData() {\r\nvar xhr = Ti.Network.createHTTPClient({\r\n\t\tonload : function() {\r\n\t\t\tTi.API.info(\"STATUS: \" + this.status);\r\n\t\t\talert(\"TEXT: \" + this.responseText);\r\n\t\t\t//json = JSON.parse(this.responseText);\r\n},\r\n\t\tonerror : function(e) {\r\n\t\t\tTi.API.info(\"STATUS: \" + this.status);\r\n\t\t\tTi.API.info(\"TEXT: \" + this.responseText);\r\n\t\t\tTi.API.info(\"ERROR: \" + e.error);\r\n\t\t\talert(L('network_problem'));\r\n\t\t},\r\n\t\ttimeout : 50000\r\n\t});\r\nvar data = {\r\n\t\tName : 'username',\r\n\t\tpassword : 'password',\r\n\t\tcity : 'select city',\r\n\t\tcountry : 'select country',\r\n\t\torder : 'order 1'\r\n\t};\r\n\talert('data' + JSON.stringify(data));\r\n\txhr.open('POST', encodeURI('http://localhost/Test/postdata.php'));\r\n\txhr.setRequestHeader('Content-Type', 'application/json');\r\n\txhr.send(JSON.stringify(data));\r\n}\r\n{code}\r\n\r\npostdata.php\r\n{code}\r\n 'invalid verb'));\r\n } \r\n?>\r\n{code}\r\n\r\n*Output:*\r\n{code}\r\n{\"Name\":\"username\",\"password\":\"password\",\"city\":\"select city\",\"country\":\"select country\",\"order\":\"order 1\"}\r\n{code}\r\n\r\nThanks.", "updateAuthor": { "name": "sdarda", "key": "sdarda", "displayName": "Sharif AbuDarda", "active": false, "timeZone": "Asia/Dhaka" }, "created": "2016-01-27T09:43:02.000+0000", "updated": "2016-01-27T09:49:58.000+0000" } ], "maxResults": 2, "total": 2, "startAt": 0 } } }