Skip to content

Commit 30d1657

Browse files
npoltorapavloMichael Fiess
authored and
Michael Fiess
committed
support Buffer for rtHttpRequest::write (pxscene#1627)
1 parent b4f7e4a commit 30d1657

File tree

6 files changed

+78
-22
lines changed

6 files changed

+78
-22
lines changed

src/rtFileDownloader.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,12 @@ static size_t ReadMemoryCallback(void *contents, size_t size, size_t nmemb, void
138138
size_t bufferSize = size * nmemb;
139139
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
140140

141-
size_t sizeLeft = mem->downloadRequest->readData().byteLength() - mem->readSize;
141+
size_t sizeLeft = mem->downloadRequest->readDataSize() - mem->readSize;
142142
if (sizeLeft > 0) {
143143
size_t copyThisMuch = sizeLeft;
144144
if (copyThisMuch > bufferSize)
145145
copyThisMuch = bufferSize;
146-
memcpy(contents, mem->downloadRequest->readData().cString() + mem->readSize, copyThisMuch);
146+
memcpy(contents, mem->downloadRequest->readData() + mem->readSize, copyThisMuch);
147147
mem->readSize += copyThisMuch;
148148
return copyThisMuch;
149149
}
@@ -188,6 +188,8 @@ rtFileDownloadRequest::rtFileDownloadRequest(const char* imageUrl, void* callbac
188188
, mIsProgressMeterSwitchOff(false), mHTTPFailOnError(false), mDefaultTimeout(false)
189189
, mCORS(), mCanceled(false), mUseCallbackDataSize(false), mCanceledMutex()
190190
, mMethod()
191+
, mReadData(NULL)
192+
, mReadDataSize(0)
191193
{
192194
mAdditionalHttpHeaders.clear();
193195
#ifdef ENABLE_HTTP_CACHE
@@ -522,16 +524,22 @@ rtString rtFileDownloadRequest::method() const
522524
return mMethod;
523525
}
524526

525-
void rtFileDownloadRequest::setReadData(const rtString& val)
527+
void rtFileDownloadRequest::setReadData(const uint8_t* data, size_t size)
526528
{
527-
mReadData = val;
529+
mReadData = data;
530+
mReadDataSize = size;
528531
}
529532

530-
rtString rtFileDownloadRequest::readData() const
533+
const uint8_t* rtFileDownloadRequest::readData() const
531534
{
532535
return mReadData;
533536
}
534537

538+
size_t rtFileDownloadRequest::readDataSize() const
539+
{
540+
return mReadDataSize;
541+
}
542+
535543
rtFileDownloader::rtFileDownloader()
536544
: mNumberOfCurrentDownloads(0), mDefaultCallbackFunction(NULL), mDownloadHandles(), mReuseDownloadHandles(false),
537545
mCaCertFile(CA_CERTIFICATE), mFileCacheMutex()
@@ -798,7 +806,7 @@ bool rtFileDownloader::downloadFromNetwork(rtFileDownloadRequest* downloadReques
798806
MemoryStruct chunk;
799807

800808
rtString method = downloadRequest->method();
801-
size_t readDataSize = downloadRequest->readData().byteLength();
809+
size_t readDataSize = downloadRequest->readDataSize();
802810

803811
curl_handle = rtFileDownloader::instance()->retrieveDownloadHandle();
804812
curl_easy_reset(curl_handle);

src/rtFileDownloader.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,9 @@ class rtFileDownloadRequest
106106
bool isCanceled();
107107
void setMethod(const char* method);
108108
rtString method() const;
109-
void setReadData(const rtString& val);
110-
rtString readData() const;
109+
void setReadData(const uint8_t* data, size_t size);
110+
const uint8_t* readData() const;
111+
size_t readDataSize() const;
111112

112113
private:
113114
rtString mFileUrl;
@@ -142,7 +143,8 @@ class rtFileDownloadRequest
142143
bool mUseCallbackDataSize;
143144
rtMutex mCanceledMutex;
144145
rtString mMethod;
145-
rtString mReadData;
146+
const uint8_t* mReadData;
147+
size_t mReadDataSize;
146148
};
147149

148150
struct rtFileDownloadHandle

src/rtHttpRequest.cpp

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,16 @@ rtDefineMethod(rtHttpRequest, removeHeader);
3737
rtHttpRequest::rtHttpRequest(const rtString& url)
3838
: mEmit(new rtEmit())
3939
, mUrl(url)
40+
, mWriteData(NULL)
41+
, mWriteDataSize(0)
4042
, mInQueue(false)
4143
{
4244
}
4345

4446
rtHttpRequest::rtHttpRequest(const rtObjectRef& options)
4547
: mEmit(new rtEmit())
48+
, mWriteData(NULL)
49+
, mWriteDataSize(0)
4650
, mInQueue(false)
4751
{
4852
rtString url;
@@ -92,6 +96,8 @@ rtHttpRequest::rtHttpRequest(const rtObjectRef& options)
9296

9397
rtHttpRequest::~rtHttpRequest()
9498
{
99+
if (mWriteData)
100+
free(mWriteData);
95101
}
96102

97103
rtError rtHttpRequest::addListener(const rtString& eventName, const rtFunctionRef& f)
@@ -130,7 +136,7 @@ rtError rtHttpRequest::end()
130136
rtFileDownloadRequest* req = new rtFileDownloadRequest(mUrl.cString(), this, rtHttpRequest::onDownloadComplete);
131137
req->setAdditionalHttpHeaders(mHeaders);
132138
req->setMethod(mMethod);
133-
req->setReadData(mWriteData);
139+
req->setReadData(mWriteData, mWriteDataSize);
134140
if (rtFileDownloader::instance()->addToDownloadQueue(req)) {
135141
mInQueue = true;
136142
return RT_OK;
@@ -140,14 +146,47 @@ rtError rtHttpRequest::end()
140146
return RT_FAIL;
141147
}
142148

143-
rtError rtHttpRequest::write(const rtString& chunk)
149+
rtError rtHttpRequest::write(const rtValue& chunk)
144150
{
145151
if (mInQueue) {
146152
rtLogError("%s: already in queue", __FUNCTION__);
147153
return RT_FAIL;
148154
}
149155

150-
mWriteData = chunk;
156+
if (mWriteData)
157+
free(mWriteData);
158+
159+
mWriteData = NULL;
160+
mWriteDataSize = 0;
161+
162+
if (!chunk.isEmpty()) {
163+
if (chunk.getType() == RT_objectType) {
164+
rtObjectRef obj = chunk.toObject();
165+
166+
uint32_t len = obj.get<uint32_t>("length");
167+
if (len > 0) {
168+
rtLogInfo("write %u bytes (Buffer)", len);
169+
mWriteData = (uint8_t*)malloc(len);
170+
mWriteDataSize = len;
171+
}
172+
for (uint32_t i = 0; i < len; i++) {
173+
mWriteData[i] = obj.get<uint8_t>(i);
174+
}
175+
} else if (chunk.getType() == RT_stringType) {
176+
rtString str = chunk.toString();
177+
178+
uint32_t len = static_cast<uint32_t>(str.byteLength());
179+
if (len > 0) {
180+
rtLogInfo("write %u bytes (string)", len);
181+
mWriteData = (uint8_t*)malloc(len);
182+
mWriteDataSize = len;
183+
memcpy(mWriteData, str.cString(), len);
184+
}
185+
} else {
186+
rtLogInfo("unknown write data type");
187+
}
188+
}
189+
151190
return RT_OK;
152191
}
153192

@@ -254,11 +293,16 @@ rtString rtHttpRequest::method() const
254293
return mMethod;
255294
}
256295

257-
rtString rtHttpRequest::writeData() const
296+
const uint8_t* rtHttpRequest::writeData() const
258297
{
259298
return mWriteData;
260299
}
261300

301+
size_t rtHttpRequest::writeDataSize() const
302+
{
303+
return mWriteDataSize;
304+
}
305+
262306
bool rtHttpRequest::inQueue() const
263307
{
264308
return mInQueue;

src/rtHttpRequest.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class rtHttpRequest : public rtObject
3434
rtMethod1ArgAndNoReturn("removeAllListeners", removeAllListenersByName, rtString);
3535
rtMethodNoArgAndNoReturn("abort", abort);
3636
rtMethodNoArgAndNoReturn("end", end);
37-
rtMethod1ArgAndNoReturn("write", write, rtString);
37+
rtMethod1ArgAndNoReturn("write", write, rtValue);
3838
rtMethod2ArgAndNoReturn("setTimeout", setTimeout, int32_t, rtFunctionRef);
3939
rtMethod2ArgAndNoReturn("setHeader", setHeader, rtString, rtString);
4040
rtMethod1ArgAndReturn("getHeader", getHeader, rtString, rtString);
@@ -50,7 +50,7 @@ class rtHttpRequest : public rtObject
5050
rtError removeAllListenersByName(const rtString& eventName);
5151
rtError abort() const;
5252
rtError end();
53-
rtError write(const rtString& chunk);
53+
rtError write(const rtValue& chunk);
5454
rtError setTimeout(int32_t msecs, const rtFunctionRef& f);
5555
rtError setHeader(const rtString& name, const rtString& value);
5656
rtError getHeader(const rtString& name, rtString& s);
@@ -61,15 +61,17 @@ class rtHttpRequest : public rtObject
6161
rtString url() const;
6262
std::vector<rtString> headers() const;
6363
rtString method() const;
64-
rtString writeData() const;
64+
const uint8_t* writeData() const;
65+
size_t writeDataSize() const;
6566
bool inQueue() const;
6667

6768
private:
6869
rtEmitRef mEmit;
6970
rtString mUrl;
7071
std::vector<rtString> mHeaders;
7172
rtString mMethod;
72-
rtString mWriteData;
73+
uint8_t* mWriteData;
74+
size_t mWriteDataSize;
7375
bool mInQueue;
7476
};
7577

src/rtScriptV8/rtWrapperUtils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ rtValue js2rt(v8::Local<v8::Context>& ctx, const Handle<Value>& val, rtWrapperEr
498498
// from some other native addon. Maybe that would actuall work and fail
499499
// at a lower level?
500500
Local<Object> obj = val->ToObject();
501-
if (obj->InternalFieldCount() > 0)
501+
if (obj->InternalFieldCount() > 0 && !val->IsArrayBufferView() /*Buffer*/)
502502
{
503503
return rtObjectWrapper::unwrapObject(obj);
504504
}

tests/pxScene2d/test_rtHttpRequest.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class rtHttpRequestTest : public testing::Test
5151
EXPECT_EQ (std::string(req->url().cString()), "https://example.com");
5252
EXPECT_EQ ((int)0, (int)req->headers().size());
5353
EXPECT_TRUE (req->method().isEmpty());
54-
EXPECT_TRUE (req->writeData().isEmpty());
54+
EXPECT_EQ ((int)0, (int)req->writeDataSize());
5555
EXPECT_FALSE (req->inQueue());
5656
}
5757

@@ -78,7 +78,7 @@ class rtHttpRequestTest : public testing::Test
7878
EXPECT_EQ (std::string(req->headers()[0].cString()), "Content-Type: application/json");
7979
EXPECT_EQ (std::string(req->headers()[1].cString()), "Authorization: token");
8080
EXPECT_EQ (std::string(req->method().cString()), "POST");
81-
EXPECT_EQ (std::string(req->writeData().cString()), "{\"postKey1\":\"postValue1\"}");
81+
EXPECT_EQ (std::string((const char*)req->writeData(), req->writeDataSize()), "{\"postKey1\":\"postValue1\"}");
8282
EXPECT_FALSE (req->inQueue());
8383
}
8484

@@ -94,7 +94,7 @@ class rtHttpRequestTest : public testing::Test
9494
EXPECT_EQ ((int)1, (int)req->headers().size());
9595
EXPECT_EQ (std::string(req->headers()[0].cString()), "Authorization: token");
9696
EXPECT_TRUE (req->method().isEmpty());
97-
EXPECT_TRUE (req->writeData().isEmpty());
97+
EXPECT_EQ ((int)0, (int)req->writeDataSize());
9898
EXPECT_FALSE (req->inQueue());
9999
}
100100

@@ -157,7 +157,7 @@ class rtHttpRequestTest : public testing::Test
157157
EXPECT_EQ (std::string(req->headers()[0].cString()), "Content-Type: application/json");
158158
EXPECT_EQ (std::string(req->headers()[1].cString()), "Authorization: token");
159159
EXPECT_EQ (std::string(req->method().cString()), "POST");
160-
EXPECT_EQ (std::string(req->writeData().cString()), "{\"postKey1\":\"postValue1\"}");
160+
EXPECT_EQ (std::string((const char*)req->writeData(), req->writeDataSize()), "{\"postKey1\":\"postValue1\"}");
161161
EXPECT_TRUE (req->inQueue());
162162

163163
// already in queue

0 commit comments

Comments
 (0)