Merge pull request #4023 from samuele3hu/developHttp

issue #3049:Add XMLHttpRequest lua binding and corresponding test sample
This commit is contained in:
James Chen 2013-10-31 20:40:29 -07:00
commit db6bce4cf0
18 changed files with 1767 additions and 5 deletions

2
.gitignore vendored
View File

@ -22,10 +22,12 @@ Thumbs.db
*.log
[Bb]in
[Dd]ebug/
[Dd]ebug.win32/
*.sbr
*.sdf
obj/
[Rr]elease/
[Rr]elease.win32/
_ReSharper*/
[Tt]est[Rr]esult*
ipch/

View File

@ -1 +1 @@
2fc86c9b16a099b711aabd5d29f835c45a1690a4
f918efd122d7a0cfabddf411f64d954d4fcd8579

View File

@ -1 +1 @@
3cdc74655a14f57ae21036886ccf31e32aaadce4
99dcbba48124bf51788735fe775650f659d7302c

View File

@ -123,7 +123,10 @@ public:
/** Get the request data pointer back */
inline char* getRequestData()
{
return &(_requestData.front());
if(_requestData.size() != 0)
return &(_requestData.front());
return nullptr;
}
/** Get the size of request data back */
inline int getRequestDataSize()

View File

@ -20,6 +20,7 @@ LOCAL_SRC_FILES := CCLuaBridge.cpp \
lua_cocos2dx_manual.cpp \
lua_cocos2dx_extension_manual.cpp \
lua_cocos2dx_deprecated.cpp \
lua_xml_http_request.cpp \
platform/android/CCLuaJavaBridge.cpp \
platform/android/jni/Java_org_cocos2dx_lib_Cocos2dxLuaJavaBridge.cpp \
../../../../external/lua/tolua/tolua_event.c \

View File

@ -53,6 +53,7 @@ extern "C" {
#include "LuaBasicConversions.h"
#include "lua_cocos2dx_extension_manual.h"
#include "lua_cocos2dx_deprecated.h"
#include "lua_xml_http_request.h"
namespace {
int lua_print(lua_State * luastate)
@ -148,6 +149,9 @@ bool LuaStack::init(void)
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
tolua_web_socket_open(_state);
#endif
register_xml_http_request(_state);
tolua_script_handler_mgr_open(_state);
// add cocos2dx loader

View File

@ -95,6 +95,8 @@ public:
TABLECELL_SIZE_FOR_INDEX,
TABLECELL_AT_INDEX,
TABLEVIEW_NUMS_OF_CELLS,
XMLHTTPREQUEST_READY_STATE_CHANGE,
};
typedef int Handler;

View File

@ -60,7 +60,8 @@ SOURCES = ../../../../external/lua/lua/lapi.c \
LuaBasicConversions.cpp \
lua_cocos2dx_manual.cpp \
lua_cocos2dx_extension_manual.cpp \
lua_cocos2dx_deprecated.cpp
lua_cocos2dx_deprecated.cpp \
lua_xml_http_request.cpp
include ../../../2d/cocos2dx.mk

View File

@ -144,6 +144,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\..\..\external\lua\luajit\prebuilt\win32\*.*" "$
<ClCompile Include="lua_cocos2dx_extension_manual.cpp" />
<ClCompile Include="lua_cocos2dx_manual.cpp" />
<ClCompile Include="Lua_web_socket.cpp" />
<ClCompile Include="lua_xml_http_request.cpp" />
<ClCompile Include="tolua_fix.c" />
</ItemGroup>
<ItemGroup>
@ -168,6 +169,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\..\..\external\lua\luajit\prebuilt\win32\*.*" "$
<ClInclude Include="lua_cocos2dx_extension_manual.h" />
<ClInclude Include="lua_cocos2dx_manual.hpp" />
<ClInclude Include="Lua_web_socket.h" />
<ClInclude Include="lua_xml_http_request.h" />
<ClInclude Include="tolua_fix.h" />
</ItemGroup>
<ItemGroup>

View File

@ -81,6 +81,9 @@
<ClCompile Include="Lua_web_socket.cpp">
<Filter>cocos2dx_support</Filter>
</ClCompile>
<ClCompile Include="lua_xml_http_request.cpp">
<Filter>cocos2dx_support</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\auto-generated\lua-bindings\lua_cocos2dx_auto.hpp">
@ -149,6 +152,9 @@
<ClInclude Include="tolua_fix.h">
<Filter>cocos2dx_support</Filter>
</ClInclude>
<ClInclude Include="lua_xml_http_request.h">
<Filter>cocos2dx_support</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\..\auto-generated\lua-bindings\lua_cocos2dx_auto_api.js">

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,100 @@
#ifndef __COCOS_SCRIPTING_LUA_BINDINGS_LUA_XML_HTTP_REQUEST_H__
#define __COCOS_SCRIPTING_LUA_BINDINGS_LUA_XML_HTTP_REQUEST_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "tolua++.h"
#ifdef __cplusplus
}
#endif
#include "network/HttpClient.h"
class LuaMinXmlHttpRequest : public cocos2d::Object
{
public:
enum class ResponseType
{
STRING,
ARRAY_BUFFER,
BLOB,
DOCUMENT,
JSON
};
// Ready States (http://www.w3.org/TR/XMLHttpRequest/#interface-xmlhttprequest)
static const unsigned short UNSENT = 0;
static const unsigned short OPENED = 1;
static const unsigned short HEADERS_RECEIVED = 2;
static const unsigned short LOADING = 3;
static const unsigned short DONE = 4;
LuaMinXmlHttpRequest();
~LuaMinXmlHttpRequest();
void handle_requestResponse(network::HttpClient *sender, network::HttpResponse *response);
inline void setResponseType(ResponseType type) { _responseType = type; }
inline ResponseType getResponseType() {return _responseType; }
inline void setWithCredentialsValue(bool value) { _withCredentialsValue = value; }
inline bool getWithCredentialsValue() {return _withCredentialsValue; }
inline void setTimeout(unsigned timeOut) {_timeout = timeOut; }
inline unsigned getTimeout() { return _timeout;}
inline void setReadyState(int readyState) { _readyState = readyState; }
inline int getReadyState() { return _readyState ;}
inline network::HttpRequest* getHttpRequest() { return _httpRequest; }
inline int getStatus() { return _status; }
inline std::string getStatusText() { return _statusText ;}
inline std::string getUrl(){return _url;}
inline void setUrl(std::string url) { _url = url ;}
inline std::string getMethod(){return _meth;}
inline void setMethod(std::string meth) { _meth = meth ; }
inline void setAsync(bool isAsync){ _isAsync = isAsync; }
inline void setIsNetWork(bool isNetWork) {_isNetwork = isNetWork; }
void _setHttpRequestHeader();
void _sendRequest();
void setRequestHeader(const char* field, const char* value);
std::map<std::string, std::string> getHttpHeader() { return _httpHeader ;}
void getByteData(unsigned char* byteData);
inline std::string getDataStr() { return _data.str(); }
inline size_t getDataSize() { return _dataSize; }
private:
void _gotHeader(std::string header);
std::string _url;
std::string _meth;
std::string _type;
std::stringstream _data;
size_t _dataSize;
int _readyState;
int _status;
std::string _statusText;
ResponseType _responseType;
unsigned _timeout;
bool _isAsync;
network::HttpRequest* _httpRequest;
bool _isNetwork;
bool _withCredentialsValue;
std::map<std::string, std::string> _httpHeader;
std::map<std::string, std::string> _requestHeader;
};
TOLUA_API int register_xml_http_request(lua_State* L);
#endif //#ifndef __COCOS_SCRIPTING_LUA_BINDINGS_LUA_XML_HTTP_REQUEST_H__

View File

@ -272,3 +272,11 @@ cc.WEBSOCKET_STATE_CONNECTING = 0
cc.WEBSOCKET_STATE_OPEN = 1
cc.WEBSOCKET_STATE_CLOSING = 2
cc.WEBSOCKET_STATE_CLOSED = 3
cc.XMLHTTPREQUEST_RESPONSE_STRING = 0
cc.XMLHTTPREQUEST_RESPONSE_ARRAY_BUFFER = 1
cc.XMLHTTPREQUEST_RESPONSE_BLOB = 2
cc.XMLHTTPREQUEST_RESPONSE_DOCUMENT = 3
cc.XMLHTTPREQUEST_RESPONSE_JSON = 4

View File

@ -0,0 +1,376 @@
-----------------------------------------------------------------------------
-- JSON4Lua: JSON encoding / decoding support for the Lua language.
-- json Module.
-- Author: Craig Mason-Jones
-- Homepage: http://json.luaforge.net/
-- Version: 0.9.40
-- This module is released under the MIT License (MIT).
-- Please see LICENCE.txt for details.
--
-- USAGE:
-- This module exposes two functions:
-- encode(o)
-- Returns the table / string / boolean / number / nil / json.null value as a JSON-encoded string.
-- decode(json_string)
-- Returns a Lua object populated with the data encoded in the JSON string json_string.
--
-- REQUIREMENTS:
-- compat-5.1 if using Lua 5.0
--
-- CHANGELOG
-- 0.9.20 Introduction of local Lua functions for private functions (removed _ function prefix).
-- Fixed Lua 5.1 compatibility issues.
-- Introduced json.null to have null values in associative arrays.
-- encode() performance improvement (more than 50%) through table.concat rather than ..
-- Introduced decode ability to ignore /**/ comments in the JSON string.
-- 0.9.10 Fix to array encoding / decoding to correctly manage nil/null values in arrays.
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-- Imports and dependencies
-----------------------------------------------------------------------------
local math = require('math')
local string = require("string")
local table = require("table")
local base = _G
-----------------------------------------------------------------------------
-- Module declaration
-----------------------------------------------------------------------------
module("json")
-- Public functions
-- Private functions
local decode_scanArray
local decode_scanComment
local decode_scanConstant
local decode_scanNumber
local decode_scanObject
local decode_scanString
local decode_scanWhitespace
local encodeString
local isArray
local isEncodable
-----------------------------------------------------------------------------
-- PUBLIC FUNCTIONS
-----------------------------------------------------------------------------
--- Encodes an arbitrary Lua object / variable.
-- @param v The Lua object / variable to be JSON encoded.
-- @return String containing the JSON encoding in internal Lua string format (i.e. not unicode)
function encode (v)
-- Handle nil values
if v==nil then
return "null"
end
local vtype = base.type(v)
-- Handle strings
if vtype=='string' then
return '"' .. encodeString(v) .. '"' -- Need to handle encoding in string
end
-- Handle booleans
if vtype=='number' or vtype=='boolean' then
return base.tostring(v)
end
-- Handle tables
if vtype=='table' then
local rval = {}
-- Consider arrays separately
local bArray, maxCount = isArray(v)
if bArray then
for i = 1,maxCount do
table.insert(rval, encode(v[i]))
end
else -- An object, not an array
for i,j in base.pairs(v) do
if isEncodable(i) and isEncodable(j) then
table.insert(rval, '"' .. encodeString(i) .. '":' .. encode(j))
end
end
end
if bArray then
return '[' .. table.concat(rval,',') ..']'
else
return '{' .. table.concat(rval,',') .. '}'
end
end
-- Handle null values
if vtype=='function' and v==null then
return 'null'
end
base.assert(false,'encode attempt to encode unsupported type ' .. vtype .. ':' .. base.tostring(v))
end
--- Decodes a JSON string and returns the decoded value as a Lua data structure / value.
-- @param s The string to scan.
-- @param [startPos] Optional starting position where the JSON string is located. Defaults to 1.
-- @param Lua object, number The object that was scanned, as a Lua table / string / number / boolean or nil,
-- and the position of the first character after
-- the scanned JSON object.
function decode(s, startPos)
startPos = startPos and startPos or 1
startPos = decode_scanWhitespace(s,startPos)
base.assert(startPos<=string.len(s), 'Unterminated JSON encoded object found at position in [' .. s .. ']')
local curChar = string.sub(s,startPos,startPos)
-- Object
if curChar=='{' then
return decode_scanObject(s,startPos)
end
-- Array
if curChar=='[' then
return decode_scanArray(s,startPos)
end
-- Number
if string.find("+-0123456789.e", curChar, 1, true) then
return decode_scanNumber(s,startPos)
end
-- String
if curChar==[["]] or curChar==[[']] then
return decode_scanString(s,startPos)
end
if string.sub(s,startPos,startPos+1)=='/*' then
return decode(s, decode_scanComment(s,startPos))
end
-- Otherwise, it must be a constant
return decode_scanConstant(s,startPos)
end
--- The null function allows one to specify a null value in an associative array (which is otherwise
-- discarded if you set the value with 'nil' in Lua. Simply set t = { first=json.null }
function null()
return null -- so json.null() will also return null ;-)
end
-----------------------------------------------------------------------------
-- Internal, PRIVATE functions.
-- Following a Python-like convention, I have prefixed all these 'PRIVATE'
-- functions with an underscore.
-----------------------------------------------------------------------------
--- Scans an array from JSON into a Lua object
-- startPos begins at the start of the array.
-- Returns the array and the next starting position
-- @param s The string being scanned.
-- @param startPos The starting position for the scan.
-- @return table, int The scanned array as a table, and the position of the next character to scan.
function decode_scanArray(s,startPos)
local array = {} -- The return value
local stringLen = string.len(s)
base.assert(string.sub(s,startPos,startPos)=='[','decode_scanArray called but array does not start at position ' .. startPos .. ' in string:\n'..s )
startPos = startPos + 1
-- Infinite loop for array elements
repeat
startPos = decode_scanWhitespace(s,startPos)
base.assert(startPos<=stringLen,'JSON String ended unexpectedly scanning array.')
local curChar = string.sub(s,startPos,startPos)
if (curChar==']') then
return array, startPos+1
end
if (curChar==',') then
startPos = decode_scanWhitespace(s,startPos+1)
end
base.assert(startPos<=stringLen, 'JSON String ended unexpectedly scanning array.')
object, startPos = decode(s,startPos)
table.insert(array,object)
until false
end
--- Scans a comment and discards the comment.
-- Returns the position of the next character following the comment.
-- @param string s The JSON string to scan.
-- @param int startPos The starting position of the comment
function decode_scanComment(s, startPos)
base.assert( string.sub(s,startPos,startPos+1)=='/*', "decode_scanComment called but comment does not start at position " .. startPos)
local endPos = string.find(s,'*/',startPos+2)
base.assert(endPos~=nil, "Unterminated comment in string at " .. startPos)
return endPos+2
end
--- Scans for given constants: true, false or null
-- Returns the appropriate Lua type, and the position of the next character to read.
-- @param s The string being scanned.
-- @param startPos The position in the string at which to start scanning.
-- @return object, int The object (true, false or nil) and the position at which the next character should be
-- scanned.
function decode_scanConstant(s, startPos)
local consts = { ["true"] = true, ["false"] = false, ["null"] = nil }
local constNames = {"true","false","null"}
for i,k in base.pairs(constNames) do
--print ("[" .. string.sub(s,startPos, startPos + string.len(k) -1) .."]", k)
if string.sub(s,startPos, startPos + string.len(k) -1 )==k then
return consts[k], startPos + string.len(k)
end
end
base.assert(nil, 'Failed to scan constant from string ' .. s .. ' at starting position ' .. startPos)
end
--- Scans a number from the JSON encoded string.
-- (in fact, also is able to scan numeric +- eqns, which is not
-- in the JSON spec.)
-- Returns the number, and the position of the next character
-- after the number.
-- @param s The string being scanned.
-- @param startPos The position at which to start scanning.
-- @return number, int The extracted number and the position of the next character to scan.
function decode_scanNumber(s,startPos)
local endPos = startPos+1
local stringLen = string.len(s)
local acceptableChars = "+-0123456789.e"
while (string.find(acceptableChars, string.sub(s,endPos,endPos), 1, true)
and endPos<=stringLen
) do
endPos = endPos + 1
end
local stringValue = 'return ' .. string.sub(s,startPos, endPos-1)
local stringEval = base.loadstring(stringValue)
base.assert(stringEval, 'Failed to scan number [ ' .. stringValue .. '] in JSON string at position ' .. startPos .. ' : ' .. endPos)
return stringEval(), endPos
end
--- Scans a JSON object into a Lua object.
-- startPos begins at the start of the object.
-- Returns the object and the next starting position.
-- @param s The string being scanned.
-- @param startPos The starting position of the scan.
-- @return table, int The scanned object as a table and the position of the next character to scan.
function decode_scanObject(s,startPos)
local object = {}
local stringLen = string.len(s)
local key, value
base.assert(string.sub(s,startPos,startPos)=='{','decode_scanObject called but object does not start at position ' .. startPos .. ' in string:\n' .. s)
startPos = startPos + 1
repeat
startPos = decode_scanWhitespace(s,startPos)
base.assert(startPos<=stringLen, 'JSON string ended unexpectedly while scanning object.')
local curChar = string.sub(s,startPos,startPos)
if (curChar=='}') then
return object,startPos+1
end
if (curChar==',') then
startPos = decode_scanWhitespace(s,startPos+1)
end
base.assert(startPos<=stringLen, 'JSON string ended unexpectedly scanning object.')
-- Scan the key
key, startPos = decode(s,startPos)
base.assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key)
startPos = decode_scanWhitespace(s,startPos)
base.assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key)
base.assert(string.sub(s,startPos,startPos)==':','JSON object key-value assignment mal-formed at ' .. startPos)
startPos = decode_scanWhitespace(s,startPos+1)
base.assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key)
value, startPos = decode(s,startPos)
object[key]=value
until false -- infinite loop while key-value pairs are found
end
--- Scans a JSON string from the opening inverted comma or single quote to the
-- end of the string.
-- Returns the string extracted as a Lua string,
-- and the position of the next non-string character
-- (after the closing inverted comma or single quote).
-- @param s The string being scanned.
-- @param startPos The starting position of the scan.
-- @return string, int The extracted string as a Lua string, and the next character to parse.
function decode_scanString(s,startPos)
base.assert(startPos, 'decode_scanString(..) called without start position')
local startChar = string.sub(s,startPos,startPos)
base.assert(startChar==[[']] or startChar==[["]],'decode_scanString called for a non-string')
local escaped = false
local endPos = startPos + 1
local bEnded = false
local stringLen = string.len(s)
repeat
local curChar = string.sub(s,endPos,endPos)
if not escaped then
if curChar==[[\]] then
escaped = true
else
bEnded = curChar==startChar
end
else
-- If we're escaped, we accept the current character come what may
escaped = false
end
endPos = endPos + 1
base.assert(endPos <= stringLen+1, "String decoding failed: unterminated string at position " .. endPos)
until bEnded
local stringValue = 'return ' .. string.sub(s, startPos, endPos-1)
local stringEval = base.loadstring(stringValue)
base.assert(stringEval, 'Failed to load string [ ' .. stringValue .. '] in JSON4Lua.decode_scanString at position ' .. startPos .. ' : ' .. endPos)
return stringEval(), endPos
end
--- Scans a JSON string skipping all whitespace from the current start position.
-- Returns the position of the first non-whitespace character, or nil if the whole end of string is reached.
-- @param s The string being scanned
-- @param startPos The starting position where we should begin removing whitespace.
-- @return int The first position where non-whitespace was encountered, or string.len(s)+1 if the end of string
-- was reached.
function decode_scanWhitespace(s,startPos)
local whitespace=" \n\r\t"
local stringLen = string.len(s)
while ( string.find(whitespace, string.sub(s,startPos,startPos), 1, true) and startPos <= stringLen) do
startPos = startPos + 1
end
return startPos
end
--- Encodes a string to be JSON-compatible.
-- This just involves back-quoting inverted commas, back-quotes and newlines, I think ;-)
-- @param s The string to return as a JSON encoded (i.e. backquoted string)
-- @return The string appropriately escaped.
function encodeString(s)
s = string.gsub(s,'\\','\\\\')
s = string.gsub(s,'"','\\"')
s = string.gsub(s,"'","\\'")
s = string.gsub(s,'\n','\\n')
s = string.gsub(s,'\t','\\t')
return s
end
-- Determines whether the given Lua type is an array or a table / dictionary.
-- We consider any table an array if it has indexes 1..n for its n items, and no
-- other data in the table.
-- I think this method is currently a little 'flaky', but can't think of a good way around it yet...
-- @param t The table to evaluate as an array
-- @return boolean, number True if the table can be represented as an array, false otherwise. If true,
-- the second returned value is the maximum
-- number of indexed elements in the array.
function isArray(t)
-- Next we count all the elements, ensuring that any non-indexed elements are not-encodable
-- (with the possible exception of 'n')
local maxIndex = 0
for k,v in base.pairs(t) do
if (base.type(k)=='number' and math.floor(k)==k and 1<=k) then -- k,v is an indexed pair
if (not isEncodable(v)) then return false end -- All array elements must be encodable
maxIndex = math.max(maxIndex,k)
else
if (k=='n') then
if v ~= table.getn(t) then return false end -- False if n does not hold the number of elements
else -- Else of (k=='n')
if isEncodable(v) then return false end
end -- End of (k~='n')
end -- End of k,v not an indexed pair
end -- End of loop across all pairs
return true, maxIndex
end
--- Determines whether the given Lua object / table / variable can be JSON encoded. The only
-- types that are JSON encodable are: string, boolean, number, nil, table and json.null.
-- In this implementation, all other types are ignored.
-- @param o The object to examine.
-- @return boolean True if the object should be JSON encoded, false if it should be ignored.
function isEncodable(o)
local t = base.type(o)
return (t=='string' or t=='boolean' or t=='number' or t=='nil' or t=='table') or (t=='function' and o==null)
end

View File

@ -0,0 +1,21 @@
The MIT License
Copyright (c) 2009 Craig Mason-Jones
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE

View File

@ -0,0 +1,147 @@
require("json")
local function XMLHttpRequestLayer()
local layer = cc.Layer:create()
local winSize = cc.Director:getInstance():getWinSize()
local margin = 40
local space = 35
local function init()
local label = cc.LabelTTF:create("XML Http Request Test", "Arial", 28)
label:setPosition(cc.p(winSize.width / 2, winSize.height - margin))
layer:addChild(label, 0)
--Response Code Label
local labelStatusCode = cc.LabelTTF:create("HTTP Status Code", "Marker Felt", 20)
labelStatusCode:setPosition(cc.p(winSize.width / 2, winSize.height - margin - 6 * space))
layer:addChild(labelStatusCode)
local menuRequest = cc.Menu:create()
menuRequest:setPosition(cc.p(0,0))
layer:addChild(menuRequest)
--Get
local function onMenuGetClicked()
local xhr = XMLHttpRequest:new()
xhr.responseType = cc.XMLHTTPREQUEST_RESPONSE_STRING
xhr:open("GET", "http://httpbin.org/get")
local function onReadyStateChange()
local statusString = "Http Status Code:"..xhr.statusText
labelStatusCode:setString(statusString)
print(xhr.response)
end
xhr:registerScriptHandler(onReadyStateChange)
xhr:send()
labelStatusCode:setString("waiting...")
end
local labelGet = cc.LabelTTF:create("Test Get", "Arial", 22)
local itemGet = cc.MenuItemLabel:create(labelGet)
itemGet:registerScriptTapHandler(onMenuGetClicked)
itemGet:setPosition(cc.p(winSize.width / 2, winSize.height - margin - space))
menuRequest:addChild(itemGet)
--Post
local function onMenuPostClicked()
local xhr = XMLHttpRequest:new()
xhr.responseType = cc.XMLHTTPREQUEST_RESPONSE_STRING
xhr:open("POST", "http://httpbin.org/post")
local function onReadyStateChange()
labelStatusCode:setString("Http Status Code:"..xhr.statusText)
print(xhr.response)
end
xhr:registerScriptHandler(onReadyStateChange)
xhr:send()
labelStatusCode:setString("waiting...")
end
local labelPost = cc.LabelTTF:create("Test Post", "Arial", 22)
local itemPost = cc.MenuItemLabel:create(labelPost)
itemPost:registerScriptTapHandler(onMenuPostClicked)
itemPost:setPosition(cc.p(winSize.width / 2, winSize.height - margin - 2 * space))
menuRequest:addChild(itemPost)
--Post Binary
local function onMenuPostBinaryClicked()
local xhr = XMLHttpRequest:new()
xhr.responseType = cc.XMLHTTPREQUEST_RESPONSE_ARRAY_BUFFER
xhr:open("POST", "http://httpbin.org/post")
local function onReadyStateChange()
local response = xhr.response
local size = table.getn(response)
local strInfo = ""
for i = 1,size do
if 0 == response[i] then
strInfo = strInfo.."\'\\0\'"
else
strInfo = strInfo..string.char(response[i])
end
end
labelStatusCode:setString("Http Status Code:"..xhr.statusText)
print(strInfo)
end
xhr:registerScriptHandler(onReadyStateChange)
xhr:send()
labelStatusCode:setString("waiting...")
end
local labelPostBinary = cc.LabelTTF:create("Test Post Binary", "Arial", 22)
local itemPostBinary = cc.MenuItemLabel:create(labelPostBinary)
itemPostBinary:registerScriptTapHandler(onMenuPostBinaryClicked)
itemPostBinary:setPosition(cc.p(winSize.width / 2, winSize.height - margin - 3 * space))
menuRequest:addChild(itemPostBinary)
--Post Json
local function onMenuPostJsonClicked()
local xhr = XMLHttpRequest:new()
xhr.responseType = cc.XMLHTTPREQUEST_RESPONSE_JSON
xhr:open("POST", "http://httpbin.org/post")
local function onReadyStateChange()
labelStatusCode:setString("Http Status Code:"..xhr.statusText)
local response = xhr.response
local output = json.decode(response,1)
table.foreach(output,function(i, v) print (i, v) end)
print("headers are")
table.foreach(output.headers,print)
end
xhr:registerScriptHandler(onReadyStateChange)
xhr:send()
labelStatusCode:setString("waiting...")
end
local labelPostJson = cc.LabelTTF:create("Test Post Json", "Arial", 22)
local itemPostJson = cc.MenuItemLabel:create(labelPostJson)
itemPostJson:registerScriptTapHandler(onMenuPostJsonClicked)
itemPostJson:setPosition(cc.p(winSize.width / 2, winSize.height - margin - 4 * space))
menuRequest:addChild(itemPostJson)
end
local function onNodeEvent(eventName)
if "enter" == eventName then
init()
end
end
layer:registerScriptHandler(onNodeEvent)
return layer
end
function XMLHttpRequestTestMain()
local scene = cc.Scene:create()
scene:addChild(XMLHttpRequestLayer())
scene:addChild(CreateBackMenuItem())
return scene
end

View File

@ -44,6 +44,7 @@ require "luaScript/TransitionsTest/TransitionsTest"
require "luaScript/UserDefaultTest/UserDefaultTest"
require "luaScript/ZwoptexTest/ZwoptexTest"
require "luaScript/LuaBridgeTest/LuaBridgeTest"
require "luaScript/XMLHttpRequestTest/XMLHttpRequestTest"
local LINE_SPACE = 40
@ -97,6 +98,7 @@ local _allTests = {
{ isSupported = true, name = "TouchesTest" , create_func = TouchesTest },
{ isSupported = true, name = "TransitionsTest" , create_func = TransitionsTest },
{ isSupported = true, name = "UserDefaultTest" , create_func= UserDefaultTestMain },
{ isSupported = true, name = "XMLHttpRequestTest" , create_func = XMLHttpRequestTestMain },
{ isSupported = true, name = "ZwoptexTest" , create_func = ZwoptexTestMain }
}

View File

@ -84,7 +84,7 @@
<TargetMachine>MachineX86</TargetMachine>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>lua51.lib;websockets.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>libcurl_imp.lib;lua51.lib;websockets.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<ResourceCompile>
<Culture>0x0409</Culture>