summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiangph <jiangph@cn.ibm.com>2019-12-04 22:38:25 +0800
committerjiangph <jiangph@cn.ibm.com>2019-12-04 22:38:25 +0800
commit3cc47efdfd9e6510a70dff2e6462617f95af04bc (patch)
treebe9c572faa9f8281524ebf73bc91cc03f5f7d0c0
parente00ff5156c8ad73bc4b91aa3282b77dd6a1a1e5f (diff)
downloadcouchdb-remove-utf8-in-sm60.tar.gz
-rw-r--r--src/couch/priv/couch_js/60/http.cpp25
-rw-r--r--src/couch/priv/couch_js/60/util.cpp17
-rw-r--r--src/couch/priv/couch_js/60/util.h1
3 files changed, 27 insertions, 16 deletions
diff --git a/src/couch/priv/couch_js/60/http.cpp b/src/couch/priv/couch_js/60/http.cpp
index 9ab47b2f0..6577cd44e 100644
--- a/src/couch/priv/couch_js/60/http.cpp
+++ b/src/couch/priv/couch_js/60/http.cpp
@@ -171,7 +171,6 @@ http_dtor(JSFreeOp* fop, JSObject* obj)
{
HTTPData* http = (HTTPData*) JS_GetPrivate(obj);
if(http) {
- if(http->url) free(http->url);
if(http->req_headers) curl_slist_free_all(http->req_headers);
free(http);
}
@@ -196,7 +195,7 @@ http_open(JSContext* cx, JSObject* req, JS::Value mth, JS::Value url, JS::Value
goto done;
}
- method = enc_string(cx, mth, NULL);
+ method = (char *)js_to_string(cx, mth).c_str();
if(!method) {
JS_ReportErrorUTF8(cx, "Failed to encode method.");
goto done;
@@ -205,7 +204,6 @@ http_open(JSContext* cx, JSObject* req, JS::Value mth, JS::Value url, JS::Value
for(methid = 0; METHODS[methid] != NULL; methid++) {
if(strcasecmp(METHODS[methid], method) == 0) break;
}
-
if(methid > OPTIONS) {
JS_ReportErrorUTF8(cx, "Invalid method specified.");
goto done;
@@ -223,7 +221,7 @@ http_open(JSContext* cx, JSObject* req, JS::Value mth, JS::Value url, JS::Value
http->url = NULL;
}
- http->url = enc_string(cx, url, NULL);
+ http->url = (char *)js_to_string(cx, url).c_str();
if(http->url == NULL) {
JS_ReportErrorUTF8(cx, "Failed to encode URL.");
goto done;
@@ -238,14 +236,12 @@ http_open(JSContext* cx, JSObject* req, JS::Value mth, JS::Value url, JS::Value
curl_slist_free_all(http->req_headers);
http->req_headers = NULL;
}
-
// Disable Expect: 100-continue
http->req_headers = curl_slist_append(http->req_headers, "Expect:");
ret = true;
done:
- if(method) free(method);
return ret;
}
@@ -271,7 +267,7 @@ http_set_hdr(JSContext* cx, JSObject* req, JS::Value name, JS::Value val)
goto done;
}
- keystr = enc_string(cx, name, NULL);
+ keystr = (char *)js_to_string(cx, name).c_str();
if(!keystr)
{
JS_ReportErrorUTF8(cx, "Failed to encode header name.");
@@ -284,7 +280,7 @@ http_set_hdr(JSContext* cx, JSObject* req, JS::Value name, JS::Value val)
goto done;
}
- valstr = enc_string(cx, val, NULL);
+ valstr = (char *)js_to_string(cx, val).c_str();
if(!valstr)
{
JS_ReportErrorUTF8(cx, "Failed to encode header value.");
@@ -304,8 +300,6 @@ http_set_hdr(JSContext* cx, JSObject* req, JS::Value name, JS::Value val)
ret = true;
done:
- if(keystr) free(keystr);
- if(valstr) free(valstr);
if(hdrbuf) free(hdrbuf);
return ret;
}
@@ -324,7 +318,7 @@ http_send(JSContext* cx, JSObject* req, JS::Value body)
}
if(!body.isUndefined()) {
- bodystr = enc_string(cx, body, &bodylen);
+ bodystr = (char *)js_to_string(cx, body).c_str();
if(!bodystr) {
JS_ReportErrorUTF8(cx, "Failed to encode body.");
goto done;
@@ -334,7 +328,6 @@ http_send(JSContext* cx, JSObject* req, JS::Value body)
ret = go(cx, req, http, bodystr, bodylen);
done:
- if(bodystr) free(bodystr);
return ret;
}
@@ -463,13 +456,12 @@ go(JSContext* cx, JSObject* obj, HTTPData* http, char* body, size_t bodylen)
tmp = JS_GetReservedSlot(obj, 0);
- if(!(referer = enc_string(cx, tmp, NULL))) {
+ if(!(referer = (char *)js_to_string(cx, tmp).c_str())) {
JS_ReportErrorUTF8(cx, "Failed to encode referer.");
if(state.recvbuf) JS_free(cx, state.recvbuf);
return ret;
}
curl_easy_setopt(HTTP_HANDLE, CURLOPT_REFERER, referer);
- free(referer);
if(http->method < 0 || http->method > OPTIONS) {
JS_ReportErrorUTF8(cx, "INTERNAL: Unknown method.");
@@ -533,6 +525,7 @@ go(JSContext* cx, JSObject* obj, HTTPData* http, char* body, size_t bodylen)
if(state.recvbuf) {
state.recvbuf[state.read] = '\0';
jsbody = dec_string(cx, state.recvbuf, state.read+1);
+ //jsbody = string_to_js(cx, std::string(state.recvbuf, state.read));
if(!jsbody) {
// If we can't decode the body as UTF-8 we forcefully
// convert it to a string by just forcing each byte
@@ -563,7 +556,6 @@ go(JSContext* cx, JSObject* obj, HTTPData* http, char* body, size_t bodylen)
if(state.recvbuf) JS_free(cx, state.recvbuf);
return ret;
}
-
ret = true;
if(state.recvbuf) JS_free(cx, state.recvbuf);
return ret;
@@ -638,7 +630,8 @@ recv_header(void *ptr, size_t size, size_t nmem, void *data)
}
// Append the new header to our array.
- hdr = dec_string(state->cx, header, length);
+
+ hdr = string_to_js(state->cx, std::string(header));
if(!hdr) {
return CURLE_WRITE_ERROR;
}
diff --git a/src/couch/priv/couch_js/60/util.cpp b/src/couch/priv/couch_js/60/util.cpp
index 894b4254e..43fe6b88f 100644
--- a/src/couch/priv/couch_js/60/util.cpp
+++ b/src/couch/priv/couch_js/60/util.cpp
@@ -22,6 +22,23 @@
#include "utf8.h"
std::string
+js_to_string(JSContext* cx, JS::Value val)
+{
+ JS::RootedString sval(cx);
+ JS::HandleValue hval = JS::HandleValue::fromMarkedLocation(&val);
+ sval = val.toString();
+
+ JS::UniqueChars chars(JS_EncodeStringToUTF8(cx, sval));
+ if(!chars) {
+ JS_ClearPendingException(cx);
+ fprintf(stderr, "Error converting value to string.\n");
+ exit(3);
+ }
+
+ return chars.get();
+}
+
+std::string
js_to_string(JSContext* cx, JS::HandleValue val)
{
JS::RootedString sval(cx);
diff --git a/src/couch/priv/couch_js/60/util.h b/src/couch/priv/couch_js/60/util.h
index 45caa341f..d24c33647 100644
--- a/src/couch/priv/couch_js/60/util.h
+++ b/src/couch/priv/couch_js/60/util.h
@@ -25,6 +25,7 @@ typedef struct {
JSString* uri;
} couch_args;
+std::string js_to_string(JSContext* cx, JS::Value val);
std::string js_to_string(JSContext* cx, JS::HandleValue val);
std::string js_to_string(JSContext* cx, JSString *str);
JSString* string_to_js(JSContext* cx, const std::string& s);