tdf / libcmis Goto Github PK
View Code? Open in Web Editor NEWC/C++ CMIS client library
License: GNU General Public License v2.0
C/C++ CMIS client library
License: GNU General Public License v2.0
Hi,
is it possible to execute a query on a repository like this:
"select * from cmis:document where cmis:name like 'name'"
Or is there a way to search for an objects 'cmis:name' property?
Maybe somebody here can help me with the following problem: Using LibreOffice (which internally uses libcmis) to log into Google Drive (in LibreOffice, "File - Open Remote... - Add service - Type: Google Drive", enter "User" and "Password" and click "OK"), with two different @googlemail.com
accounts, it consistently succeeds for one of them while it consistently fails with the other. (This is with #20 "Properly encode OAuth2 credentials" included, so it is unlikely that this is due to differences like e.g. the exact password spelling.)
Debugging into OAuth2Providers::OAuth2Gdrive
in src/libcmis/oauth2-providers.cxx
(with passing verbose = true
into SessionFactory::createSession
in src/libcmis/session-factory.cxx
, plus some printf
), the two cases proceed the same up until sending loginPasswdPost
as POST request (in // STEP 3: password page
). In both cases, loginPasswdPost
looks like (broken up for better readability)
Page=PasswordSeparationSignIn
&GALX=XXXXXXXXXXX
&gxf=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXQ%3AXXXXXXXXXXXXX
&continue=https%3A%2F%2Faccounts.google.com%2Fo%2Foauth2%2Fauth%3Fscope%3Dhttps%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive%26redirect_uri%3Durn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob%26response_type%3Dcode%26client_id%3D280867422816-9jc83t6phkfb2q8p94dtk8kr5fa8af3r.apps.googleusercontent.com%26from_login%3D1%26as%3DXXXXXXXXXXXXXXXXXXXXXX
&followup=https%3A%2F%2Faccounts.google.com%2Fo%2Foauth2%2Fauth%3Fscope%3Dhttps%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive%26redirect_uri%3Durn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob%26response_type%3Dcode%26client_id%3D280867422816-9jc83t6phkfb2q8p94dtk8kr5fa8af3r.apps.googleusercontent.com%26from_login%3D1%26as%3DXXXXXXXXXXXXXXXXXXXXXX
<mpl=nosignup
&scc=1
&sarp=1
&oauth=1
&flowName=GlifWebSignIn
&ProfileInformation=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
&SessionState=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
&_utf8=%E2%98%83
&bgresponse=js_disabled
&Email=XXXXXXXXXXXXXXXXXXXXXXXXXX%40googlemail.com
&signIn=Anmelden
&PersistentCookie=yes
&Passwd=XXXXXXXXXX
However, the responses from the server differ. In the successful case, we get a 302 Moved Temporarily
response with Location: https://accounts.google.de/accounts/SetSID?ssdc=...
, ultimately GETing a /o/oauth2/auth?scope=https://www.googleapis.com/auth/drive&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&client_id=...
HTML page titled "Request for Permission" and which is apparently as expected by the next call into parseResponse
, causing OAuth2Providers::OAuth2Gdrive
to return successfully with some non-empty code
.
But in the failing case, we directly get a 200 OK
HTML page titled "Anmelden – Google Konten" (stuff is apparently localized on the server end, I'm doing this from Germany) which is apparently not as expected by the next call into parseResponse
, and which causes OAuth2Providers::OAuth2Gdrive
to fail returning an empty code
.
(And when deliberately trying with a bad user name, or with the otherwise successful user name and a wrong password, behavior is different still, ruling out the assumption that the failing case's user name or password is bad: For a bad user name, the HTML page retrieved in // STEP 2: send email
already is different, containing some has-error
stuff. And for a bad password, the HTML page retrieved in // STEP 3: password page
contains such has-error
stuff.)
This may not even be an issue with libcmis. It smells like something is set up differently for those two Google accounts, but I have no idea what that could be. (And I get reports from other people too that their accounts don't work, in the same way.) Does anybody have an idea what might go wrong?
Run "make cppcheck" (requires cppcheck to be installed, obviously), pick an issue, fix it (unless it's a false positive, of course). Lather, rinse, repeat :-)
Note: don't touch inc/, unless it's absolutely clear that the change doesn't change API/ABI!
I think that it would be good to flush currently committed changes and make new release :)
which would require bumping the abi, is that something that is desirable?
When building libcmis with boost-1.68.0
it will fail with this error.
xml-utils.cxx:33:10: fatal error: boost/uuid/sha1.hpp: No such file or directory
#include <boost/uuid/sha1.hpp>
^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
rlibtool: error logged in slbt_exec_compile(), line 95: Success.
make[2]: *** [Makefile:765: xml-utils.lo] Error 2
make[2]: *** Waiting for unfinished jobs....
I was able to build libcmis with this hack.
sed -i 's|boost/uuid/sha1.hpp|boost/uuid/detail/sha1.hpp|' src/libcmis/xml-utils.cxx
OS: Slackware64-current
There are many places in the code that could be improved by using C++11 features. E.g., foreach loops, smart pointers, auto (especially for iterator variables), etc. (This somewhat overlaps with issue #26.)
Note: stay clear from inc/ to avoid accidental API/ABI breaks!
Hi. I'm trying to use libreoffice 5.3.0.3 to open files from google drive. At any attempt I receive: "generic input / output error" in lirebreoffice. I've built it with debugging enabled, and all I found is:
info:ucb.ucp.cmis:15923:1:ucb/source/ucp/cmis/cmis_content.cxx:584: Unexpected libcmis exception: Object not found
info:sal.file:15923:1:sal/osl/unx/file.cxx:483: FileHandle_Impl::readFileAt(24, 1154, 1024)
info:sal.file:15923:1:sal/osl/unx/file.cxx:483: FileHandle_Impl::readFileAt(24, 1170, 2926)
warn:uui:15923:1:uui/source/iahndl.cxx:246: replaceMessageWithArguments: No arguments passed!
I've tried different version of libcmis (0.5.2_pre20160820 and as of today git) but problem persists. Is there any way to debug libcmis library? How to understand what caused this excetion?
This problem also reported at libreoffice bugzilla: https://bugs.documentfoundation.org/show_bug.cgi?id=97898 and many time in different places on the internet. Currently the only resolution people found is to use .deb package from LibreOffice site. Yet I'd like to understand what causes this issue and be able use my build of libreoffice.
Downstream report: https://bugs.gentoo.org/917523
I got the same build failure with 0.6.2.
Snippet:
atom-document.cxx: In member function 'virtual std::vector<boost::shared_ptr<libcmis::Folder> > AtomDocument::getParents()':
atom-document.cxx:88:21: error: 'xmlReadMemory' was not declared in this scope; did you mean 'xmlInitMemory'?
88 | xmlDocPtr doc = xmlReadMemory( buf.c_str(), buf.size(), parentsLink->getHref( ).c_str(), NULL, 0 );
| ^~~~~~~~~~~~~
| xmlInitMemory
atom-document.cxx: In member function 'virtual libcmis::DocumentPtr AtomDocument::checkOut()':
atom-document.cxx:282:21: error: 'xmlReadMemory' was not declared in this scope; did you mean 'xmlInitMemory'?
282 | xmlDocPtr doc = xmlReadMemory( respBuf.c_str(), respBuf.size(), checkedOutUrl.c_str(), NULL, 0 );
| ^~~~~~~~~~~~~
| xmlInitMemory
atom-folder.cxx: In member function 'virtual std::vector<boost::shared_ptr<libcmis::Object> > AtomFolder::getChildren()':
atom-folder.cxx:90:25: error: 'xmlReadMemory' was not declared in this scope; did you mean 'xmlInitMemory'?
90 | xmlDocPtr doc = xmlReadMemory( buf.c_str(), buf.size(), pageUrl.c_str(), NULL, 0 );
| ^~~~~~~~~~~~~
| xmlInitMemory
atom-object-type.cxx: In member function 'void AtomObjectType::refreshImpl(xmlDocPtr)':
atom-object-type.cxx:128:15: error: 'xmlReadMemory' was not declared in this scope; did you mean 'xmlInitMemory'?
128 | doc = xmlReadMemory( buf.c_str(), buf.size(), m_selfUrl.c_str(), NULL, 0 );
| ^~~~~~~~~~~~~
| xmlInitMemory
atom-object.cxx: In member function 'virtual libcmis::ObjectPtr AtomObject::updateProperties(const libcmis::PropertyPtrMap&)':
atom-object.cxx:152:21: error: 'xmlReadMemory' was not declared in this scope; did you mean 'xmlInitMemory'?
152 | xmlDocPtr doc = xmlReadMemory( respBuf.c_str(), respBuf.size(), getInfosUrl().c_str(), NULL, 0 );
| ^~~~~~~~~~~~~
| xmlInitMemory
atom-document.cxx: In member function 'virtual libcmis::DocumentPtr AtomDocument::checkIn(bool, std::string, const libcmis::PropertyPtrMap&, boost::shared_ptr<std::basic_ostream<char> >, std::string, std::string)':
atom-document.cxx:378:21: error: 'xmlReadMemory' was not declared in this scope; did you mean 'xmlInitMemory'?
378 | xmlDocPtr doc = xmlReadMemory( respBuf.c_str(), respBuf.size(), checkInUrl.c_str(), NULL, 0 );
| ^~~~~~~~~~~~~
| xmlInitMemory
atom-folder.cxx: In member function 'virtual libcmis::FolderPtr AtomFolder::createFolder(const libcmis::PropertyPtrMap&)':
atom-folder.cxx:177:21: error: 'xmlReadMemory' was not declared in this scope; did you mean 'xmlInitMemory'?
177 | xmlDocPtr doc = xmlReadMemory( respBuf.c_str(), respBuf.size(), getInfosUrl().c_str(), NULL, 0 );
| ^~~~~~~~~~~~~
| xmlInitMemory
atom-object.cxx: In member function 'virtual libcmis::AllowableActionsPtr AtomObject::getAllowableActions()':
atom-object.cxx:176:33: error: 'xmlReadMemory' was not declared in this scope; did you mean 'xmlInitMemory'?
176 | xmlDocPtr doc = xmlReadMemory( buf.c_str(), buf.size(), link->getHref().c_str(), NULL, 0 );
| ^~~~~~~~~~~~~
| xmlInitMemory
atom-object.cxx: In member function 'virtual void AtomObject::refreshImpl(xmlDocPtr)':
atom-object.cxx:207:15: error: 'xmlReadMemory' was not declared in this scope; did you mean 'xmlInitMemory'?
207 | doc = xmlReadMemory( buf.c_str(), buf.size(), getInfosUrl().c_str(), NULL, 0 );
| ^~~~~~~~~~~~~
| xmlInitMemory
atom-document.cxx: In member function 'virtual std::vector<boost::shared_ptr<libcmis::Document> > AtomDocument::getAllVersions()':
atom-document.cxx:414:25: error: 'xmlReadMemory' was not declared in this scope; did you mean 'xmlInitMemory'?
414 | xmlDocPtr doc = xmlReadMemory( buf.c_str(), buf.size(), pageUrl.c_str(), NULL, 0 );
| ^~~~~~~~~~~~~
| xmlInitMemory
atom-folder.cxx: In member function 'virtual libcmis::DocumentPtr AtomFolder::createDocument(const libcmis::PropertyPtrMap&, boost::shared_ptr<std::basic_ostream<char> >, std::string, std::string)':
atom-folder.cxx:223:115: error: 'XML_PARSE_NOERROR' was not declared in this scope; did you mean 'XML_ERR_ERROR'?
223 | boost::shared_ptr< xmlDoc > doc( xmlReadMemory( respBuf.c_str(), respBuf.size(), getInfosUrl().c_str(), NULL, XML_PARSE_NOERROR ), xmlFreeDoc );
| ^~~~~~~~~~~~~~~~~
| XML_ERR_ERROR
atom-object.cxx: In member function 'virtual void AtomObject::move(boost::shared_ptr<libcmis::Folder>, boost::shared_ptr<libcmis::Folder>)':
atom-object.cxx:305:21: error: 'xmlReadMemory' was not declared in this scope; did you mean 'xmlInitMemory'?
305 | xmlDocPtr doc = xmlReadMemory( respBuf.c_str(), respBuf.size(), getInfosUrl().c_str(), NULL, 0 );
| ^~~~~~~~~~~~~
| xmlInitMemory
atom-folder.cxx:223:38: error: 'xmlReadMemory' was not declared in this scope; did you mean 'xmlInitMemory'?
223 | boost::shared_ptr< xmlDoc > doc( xmlReadMemory( respBuf.c_str(), respBuf.size(), getInfosUrl().c_str(), NULL, XML_PARSE_NOERROR ), xmlFreeDoc );
| ^~~~~~~~~~~~~
| xmlInitMemory
I get the following error:
Making all in libcmis-c
make[2]: Entering directory '/home/lfs/libcmis/src/libcmis-c'
CXX libcmis_c_0.5_la-repository.lo
In file included from /usr/include/c++/8.3.0/bits/stl_algobase.h:63,
from /usr/include/c++/8.3.0/memory:62,
from /usr/include/unicode/localpointer.h:45,
from /usr/include/unicode/uenum.h:23,
from /usr/include/unicode/ucnv.h:53,
from /usr/include/libxml2/libxml/encoding.h:31,
from /usr/include/libxml2/libxml/parser.h:810,
from /usr/include/libxml2/libxml/globals.h:18,
from /usr/include/libxml2/libxml/threads.h:35,
from /usr/include/libxml2/libxml/xmlmemory.h:218,
from /usr/include/libxml2/libxml/tree.h:1307,
from ../../inc/libcmis-c/repository.h:35,
from repository.cxx:29:
/usr/include/c++/8.3.0/ext/numeric_traits.h:54:3: error: template with C linkage
template
^~~~~~~~
In file included from repository.cxx:29:
../../inc/libcmis-c/repository.h:32:1: note: ‘extern "C"’ linkage started here
extern "C" {
^~~~~~~~~~
In file included from /usr/include/c++/8.3.0/bits/stl_algobase.h:63,
from /usr/include/c++/8.3.0/memory:62,
from /usr/include/unicode/localpointer.h:45,
from /usr/include/unicode/uenum.h:23,
from /usr/include/unicode/ucnv.h:53,
from /usr/include/libxml2/libxml/encoding.h:31,
from /usr/include/libxml2/libxml/parser.h:810,
from /usr/include/libxml2/libxml/globals.h:18,
from /usr/include/libxml2/libxml/threads.h:35,
from /usr/include/libxml2/libxml/xmlmemory.h:218,
from /usr/include/libxml2/libxml/tree.h:1307,
from ../../inc/libcmis-c/repository.h:35,
from repository.cxx:29:
/usr/include/c++/8.3.0/ext/numeric_traits.h:67:3: error: template with C linkage
template
^~~~~~~~
n file included from repository.cxx:29:
../../inc/libcmis-c/repository.h:32:1: note: ‘extern "C"’ linkage started here
extern "C" {
^~~~~~~~~~
In file included from /usr/include/c++/8.3.0/bits/stl_algobase.h:63,
from /usr/include/c++/8.3.0/memory:62,
from /usr/include/unicode/localpointer.h:45,
from /usr/include/unicode/uenum.h:23,
from /usr/include/unicode/ucnv.h:53,
from /usr/include/libxml2/libxml/encoding.h:31,
from /usr/include/libxml2/libxml/parser.h:810,
from /usr/include/libxml2/libxml/globals.h:18,
from /usr/include/libxml2/libxml/threads.h:35,
from /usr/include/libxml2/libxml/xmlmemory.h:218,
from /usr/include/libxml2/libxml/tree.h:1307,
from ../../inc/libcmis-c/repository.h:35,
from repository.cxx:29:
/usr/include/c++/8.3.0/ext/numeric_traits.h:70:3: error: template with C linkage
template
^~~~~~~~
In file included from repository.cxx:29:
../../inc/libcmis-c/repository.h:32:1: note: ‘extern "C"’ linkage started here
extern "C" {
^~~~~~~~~~
In file included from /usr/include/c++/8.3.0/bits/stl_algobase.h:63,
from /usr/include/c++/8.3.0/memory:62,
from /usr/include/unicode/localpointer.h:45,
from /usr/include/unicode/uenum.h:23,
from /usr/include/unicode/ucnv.h:53,
from /usr/include/libxml2/libxml/encoding.h:31,
from /usr/include/libxml2/libxml/parser.h:810,
from /usr/include/libxml2/libxml/globals.h:18,
from /usr/include/libxml2/libxml/threads.h:35,
from /usr/include/libxml2/libxml/xmlmemory.h:218,
from /usr/include/libxml2/libxml/tree.h:1307,
from ../../inc/libcmis-c/repository.h:35,
from repository.cxx:29:
/usr/include/c++/8.3.0/ext/numeric_traits.h:73:3: error: template with C linkage
template
^~~~~~~~
.... etc
In file included from repository.cxx:29:
../../inc/libcmis-c/repository.h:32:1: note: ‘extern "C"’ linkage started here
extern "C" {
^~~~~~~~~~
In file included from /usr/include/unicode/localpointer.h:45,
from /usr/include/unicode/uenum.h:23,
from /usr/include/unicode/ucnv.h:53,
from /usr/include/libxml2/libxml/encoding.h:31,
from /usr/include/libxml2/libxml/parser.h:810,
from /usr/include/libxml2/libxml/globals.h:18,
from /usr/include/libxml2/libxml/threads.h:35,
from /usr/include/libxml2/libxml/xmlmemory.h:218,
from /usr/include/libxml2/libxml/tree.h:1307,
from ../../inc/libcmis-c/repository.h:35,
from repository.cxx:29:
/usr/include/c++/8.3.0/memory:135:1: error: template with C linkage
template
^~~~~~~~
In file included from repository.cxx:29:
../../inc/libcmis-c/repository.h:32:1: note: ‘extern "C"’ linkage started here
extern "C" {
^~~~~~~~~~
make[2]: *** [Makefile:614: libcmis_c_0.5_la-repository.lo] Error 1
make[2]: Leaving directory '/home/lfs/libcmis/src/libcmis-c'
make[1]: *** [Makefile:522: all-recursive] Error 1
make[1]: Leaving directory '/home/lfs/libcmis/src'
make: *** [Makefile:536: all-recursive] Error 1
Could be helpful for https://bugs.documentfoundation.org/show_bug.cgi?id=142526
I'm interested in using libcmis-c but it doesn't seem like there's documentation anywhere, and the libcmis-c headers mostly seem to not have any comments. What's the most practical way for someone to get going with it?
../../src/libcmis/folder.hxx:62:70: warning: dynamic exception specifications are deprecated in C++11 [-Wdeprecated]
virtual ::boost::shared_ptr< Folder > getFolderParent( ) throw ( Exception );
LibreOffice master requires a C++17 compiler now, so configuring it --with-system-libcmis fails when including libcmis headers that still use dynamic exception specifications. (The LibreOffice --without-system-libcmis case is covered through a local external/libcmis/c++17.patch.0.)
Therefore, it would be helpful if there were an official libcmis release that includes 172e837 "Merge pull request #16 from vmiklos/dynexcspec: Remove dynamic exception specifications".
Otherwise the autoreconf by default would fail for not finding the gnu files like README document.
Index: libcmis-0.5.1/configure.ac
===================================================================
--- libcmis-0.5.1.orig/configure.ac
+++ libcmis-0.5.1/configure.ac
@@ -10,7 +10,7 @@ m4_define([libcmis_version],[libcmis_api
AC_PREREQ([2.63])
AC_INIT([libcmis], [libcmis_version])
-AM_INIT_AUTOMAKE()
+AM_INIT_AUTOMAKE([1.10 foreign dist-xz])
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
# Checks for programs.
Since upgrading to version 1.72 of cppcheck, the cppcheck test fails:
[src/libcmis/oauth2-providers.cxx:163]: (performance) Inefficient usage of string::find() in condition; string::compare() would be faster.
[src/libcmis/oauth2-providers.cxx:167]: (performance) Inefficient usage of string::find() in condition; string::compare() would be faster.
[src/libcmis/oauth2-providers.cxx:169]: (performance) Inefficient usage of string::find() in condition; string::compare() would be faster.
[src/libcmis/ws-relatedmultipart.cxx:125]: (performance) Inefficient usage of string::find() in condition; string::compare() would be faster.
[src/libcmis/ws-relatedmultipart.cxx:146]: (performance) Inefficient usage of string::find() in condition; string::compare() would be faster.
[src/libcmis/ws-relatedmultipart.cxx:203]: (performance) Inefficient usage of string::find() in condition; string::compare() would be faster.
[*]: (information) Unmatched suppression: noExplicitCopyMoveConstructor
(information) Cppcheck cannot find all the include files (use --check-config for details)
FAIL cppcheck-test.sh (exit status: 1)
Last known working cppcheck version was 1.69. I've tried with all versions of cppcheck from 1.72 to 1.75 and with git master and they do not work.
See relevant Gentoo bug: https://bugs.gentoo.org/show_bug.cgi?id=577926
To use MS SharePoint 2013 REST API in LibreOffice, I choose SharePoint 2013 type and get this host template string:
http://<host>/_api/Web
I need to substitute <host>
with my sharepoint site path, like this: sharepoint2013/sites/mysite, so the overall result looks like this:
http://sharepoint2013/sites/mysite/_api/Web
Then I choose the repository, that is SharePoint. That repository is defined in libcmis's src/libcmis/sharepoint-repository.[hc]xx
In it, the m_rootId is defined as baseUrl + "/getFolderByServerRelativeUrl('/')"
But that's incorrect, because this will try to get the object http://sharepoint2013/, while the real root for this site is http://sharepoint2013/sites/mysite/. (You know, that getFolderByServerRelativeUrl API is used, that is server-relative as the name suggests, not site-relative; see e.g. http://stackoverflow.com/questions/21254703/web-getfilebyserverrelativeurl-throws-value-does-not-fall-within-expected-range). Sharepoint does throw the "Value does not fall within expected range" error for that URL.
So, ideally, there should be baseUrl + "/getFolderByServerRelativeUrl('/sites/mysite/')"
, but that's unclear how to do that reliably, because that requires parsing the baseURL and stripping both server (which is easy) and API part like "_api/Web", and I don't know if that's good to search for that string hard-coded.
However, I found out that using just baseUrl + "/getFolderByServerRelativeUrl('')"
works OK instead. I don't know if that is OK to do that, and wouldn't that be context-dependent. Could you please advise me how to best deal with this to make a patch.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.