Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
jio
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Roque
jio
Commits
ad6aae46
Commit
ad6aae46
authored
Jan 17, 2013
by
Sven Franck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
webDav Storage: putAttachment new API and qunit tests
parent
326eba96
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
238 additions
and
24 deletions
+238
-24
src/jio.storage/davstorage.js
src/jio.storage/davstorage.js
+165
-19
test/jiotests.js
test/jiotests.js
+73
-5
No files found.
src/jio.storage/davstorage.js
View file @
ad6aae46
...
@@ -88,22 +88,31 @@ jIO.addStorageType('dav', function (spec, my) {
...
@@ -88,22 +88,31 @@ jIO.addStorageType('dav', function (spec, my) {
return
$
.
support
.
cors
;
return
$
.
support
.
cors
;
};
};
// wedDav methods rfc4918
// wedDav methods rfc4918 (short summary)
// PROPFIND
// COPY Reproduces single resources (files) and collections (directory
// PROPPATCH
// trees). Will overwrite files (if specified by request) but will
// MCKOL
// respond 209 (Conflict) if it would overwrite a tree
// GET
// DELETE deletes files and directory trees
// > resource = return content of element xyz.abc
// GET just the vanilla HTTP/1.1 behaviour
// > collection > allDocs
// HEAD ditto
// > attachment = return content of element xyz_.abc/att.def
// LOCK locks a resources
// HEAD
// MKCOL creates a directory
// POST
// MOVE Moves (rename or copy) a file or a directory tree. Will
// DELETE
// 'overwrite' files (if specified by the request) but will respond
// PUT
// 209 (Conflict) if it would overwrite a tree.
// COPY
// OPTIONS If WebDAV is enabled and available for the path this reports the
// MOVE
// WebDAV extension methods
// LOCK
// PROPFIND Retrieves the requested file characteristics, DAV lock status
// UNLOCK
// and 'dead' properties for individual files, a directory and its
// child files, or a directory tree
// PROPPATCHset and remove 'dead' meta-data properties
// PUT Update or create resource or collections
// UNLOCK unlocks a resource
// Notes: all Ajax requests should be CORS (cross-domain)
// adding custom headers triggers preflight OPTIONS request!
// http://remysharp.com/2011/04/21/getting-cors-working/
priv
.
putOrPost
=
function
(
command
,
type
)
{
priv
.
putOrPost
=
function
(
command
,
type
)
{
var
doc
=
command
.
getDocId
(),
var
doc
=
command
.
getDocId
(),
...
@@ -241,17 +250,154 @@ jIO.addStorageType('dav', function (spec, my) {
...
@@ -241,17 +250,154 @@ jIO.addStorageType('dav', function (spec, my) {
});
});
};
};
/**
* Creates a new document
* @method post
* @param {object} command The JIO command
*/
that
.
post
=
function
(
command
)
{
that
.
post
=
function
(
command
)
{
priv
.
putOrPost
(
command
,
'
POST
'
);
priv
.
putOrPost
(
command
,
'
POST
'
);
};
};
/**
/**
* Saves a document in the distant dav storage.
* Creates or updates a document
* @method put
* @method put
* @param {object} command The JIO command
*/
*/
that
.
put
=
function
(
command
)
{
that
.
put
=
function
(
command
)
{
priv
.
putOrPost
(
command
,
'
PUT
'
);
priv
.
putOrPost
(
command
,
'
PUT
'
);
};
// end put
};
/**
* Add an attachment to a document
* @method putAttachment
* @param {object} command The JIO command
*/
that
.
putAttachment
=
function
(
command
)
{
var
docid
=
command
.
getDocId
(),
doc
,
secured_docid
,
secured_attachmentid
,
attachment_url
;
// no docId
if
(
!
(
typeof
docid
===
"
string
"
&&
docid
!==
""
))
{
that
.
error
({
"
status
"
:
405
,
"
statusText
"
:
"
Method Not Allowed
"
,
"
error
"
:
"
method_not_allowed
"
,
"
message
"
:
"
Cannot create document which id is undefined
"
,
"
reason
"
:
"
Document id is undefined
"
});
return
;
}
// no cross domain ajax
if
(
priv
.
checkCors
===
false
)
{
that
.
error
({
"
status
"
:
405
,
"
statusText
"
:
"
Method Not Allowed
"
,
"
error
"
:
"
method_not_allowed
"
,
"
message
"
:
"
Browser does not support cross domain ajax requests
"
,
"
reason
"
:
"
cors is undefined
"
});
return
;
}
secured_docid
=
priv
.
secureDocId
(
docid
);
url
=
priv
.
url
+
'
/
'
+
secured_docid
;
// see if the underlying document exists ||
$
.
ajax
({
url
:
url
+
'
?_=
'
+
Date
.
now
(),
type
:
'
GET
'
,
async
:
true
,
dataType
:
'
text
'
,
crossdomain
:
true
,
headers
:
{
Authorization
:
'
Basic
'
+
Base64
.
encode
(
priv
.
username
+
'
:
'
+
priv
.
password
)
},
success
:
function
(
response
)
{
doc
=
JSON
.
parse
(
response
);
// the document exists - update document
doc
.
_attachments
=
doc
.
_attachments
||
{};
doc
.
_attachments
[
command
.
getAttachmentId
()]
=
{
"
content_type
"
:
command
.
getAttachmentMimeType
(),
"
digest
"
:
"
md5-
"
+
command
.
md5SumAttachmentData
(),
"
length
"
:
command
.
getAttachmentLength
()
};
// put updated document data
$
.
ajax
({
url
:
url
+
'
?_=
'
+
Date
.
now
(),
type
:
'
PUT
'
,
data
:
doc
,
async
:
true
,
crossdomain
:
true
,
headers
:
{
Authorization
:
'
Basic
'
+
Base64
.
encode
(
priv
.
username
+
'
:
'
+
priv
.
password
)
},
// xhrFields: {withCredentials: 'true'},
success
:
function
()
{
secured_attachmentid
=
priv
.
secureDocId
(
command
.
getAttachmentId
());
attachment_url
=
url
+
'
/
'
+
secured_attachmentid
;
$
.
ajax
({
url
:
attachment_url
+
'
?_=
'
+
Date
.
now
(),
type
:
'
PUT
'
,
data
:
command
.
getDoc
(),
async
:
true
,
crossdomain
:
true
,
headers
:
{
Authorization
:
'
Basic
'
+
Base64
.
encode
(
priv
.
username
+
'
:
'
+
priv
.
password
)
},
// xhrFields: {withCredentials: 'true'},
success
:
function
(
response
)
{
that
.
success
({
ok
:
true
,
id
:
command
.
getDocId
()
+
'
/
'
+
command
.
getAttachmentId
()
});
},
error
:
function
(
type
)
{
that
.
error
({
"
status
"
:
409
,
"
statusText
"
:
"
Conflicts
"
,
"
error
"
:
"
conflicts
"
,
"
message
"
:
"
Cannot modify document
"
,
"
reason
"
:
"
Error trying to save attachment to remote storage
"
});
return
;
}
});
},
error
:
function
(
type
)
{
that
.
error
({
"
status
"
:
409
,
"
statusText
"
:
"
Conflicts
"
,
"
error
"
:
"
conflicts
"
,
"
message
"
:
"
Cannot modify document
"
,
"
reason
"
:
"
Error trying to write to remote storage
"
});
return
;
}
});
},
error
:
function
()
{
// the document does not exist
that
.
error
({
"
status
"
:
404
,
"
statusText
"
:
"
Not Found
"
,
"
error
"
:
"
not_found
"
,
"
message
"
:
"
Impossible to add attachment
"
,
"
reason
"
:
"
Document not found
"
});
return
;
}
});
};
/**
/**
* Loads a document from a distant dav storage.
* Loads a document from a distant dav storage.
...
...
test/jiotests.js
View file @
ad6aae46
...
@@ -239,6 +239,7 @@ generateTools = function (sinon) {
...
@@ -239,6 +239,7 @@ generateTools = function (sinon) {
o
.
addFakeServerResponse
=
function
(
method
,
path
,
status
,
response
)
{
o
.
addFakeServerResponse
=
function
(
method
,
path
,
status
,
response
)
{
var
url
=
new
RegExp
(
'
https:
\\
/
\\
/ca-davstorage:8080
\\
/
'
+
path
+
var
url
=
new
RegExp
(
'
https:
\\
/
\\
/ca-davstorage:8080
\\
/
'
+
path
+
'
(
\\
?.*|$)
'
);
'
(
\\
?.*|$)
'
);
// console.log("adding response for: "+method+" "+url );
o
.
server
.
respondWith
(
method
,
url
,
o
.
server
.
respondWith
(
method
,
url
,
[
status
,
{
"
Content-Type
"
:
'
application/xml
'
},
response
]
[
status
,
{
"
Content-Type
"
:
'
application/xml
'
},
response
]
);
);
...
@@ -2049,14 +2050,15 @@ test ("Post", function () {
...
@@ -2049,14 +2050,15 @@ test ("Post", function () {
o
.
addFakeServerResponse
(
"
GET
"
,
"
myFile
"
,
200
,
o
.
answer
);
o
.
addFakeServerResponse
(
"
GET
"
,
"
myFile
"
,
200
,
o
.
answer
);
o
.
spy
(
o
,
"
status
"
,
409
,
"
Post but document already exists
"
);
o
.
spy
(
o
,
"
status
"
,
409
,
"
Post but document already exists
"
);
o
.
jio
.
post
({
"
_id
"
:
"
myFile
"
,
"
title
"
:
"
hello again
"
},
o
.
f
);
o
.
jio
.
post
({
"
_id
"
:
"
myFile
"
,
"
title
"
:
"
hello again
"
},
o
.
f
);
o
.
clock
.
tick
(
1000
);
o
.
server
.
respond
();
o
.
clock
.
tick
(
5000
);
o
.
clock
.
tick
(
5000
);
o
.
server
.
respond
();
// as all custom headers trigger preflight requests, the test also
// need to simulate CORS (cross domain ajax with preflight)
// custom header may be authentication for example
o
.
jio
.
stop
();
o
.
jio
.
stop
();
// do the same tests live webDav-Server
// do the same tests live webDav-Server simulating CORS!
// check for credentials in sinon
/* also check for equality
/* also check for equality
deepEqual(
deepEqual(
...
@@ -2093,6 +2095,9 @@ test ("Put", function(){
...
@@ -2093,6 +2095,9 @@ test ("Put", function(){
o
.
jio
.
put
({
"
_id
"
:
"
put1
"
,
"
title
"
:
"
myPut1
"
},
o
.
f
);
o
.
jio
.
put
({
"
_id
"
:
"
put1
"
,
"
title
"
:
"
myPut1
"
},
o
.
f
);
o
.
clock
.
tick
(
5000
);
o
.
clock
.
tick
(
5000
);
o
.
server
.
respond
();
o
.
server
.
respond
();
//console.log( o.server );
//console.log( o.server.requests[0].requestHeaders );
//console.log( o.server.requests[0].responseHeaders );
// put but document already exists = update
// put but document already exists = update
o
.
answer
=
JSON
.
stringify
({
"
_id
"
:
"
put1
"
,
"
title
"
:
"
myPut1
"
});
o
.
answer
=
JSON
.
stringify
({
"
_id
"
:
"
put1
"
,
"
title
"
:
"
myPut1
"
});
...
@@ -2105,10 +2110,73 @@ test ("Put", function(){
...
@@ -2105,10 +2110,73 @@ test ("Put", function(){
o
.
jio
.
stop
();
o
.
jio
.
stop
();
// do the same tests live webDav-Server
// do the same tests live webDav-Server
/simulate CORS
// check for credentials in sinon
// check for credentials in sinon
});
});
test
(
"
PutAttachment
"
,
function
(){
var
o
=
generateTools
(
this
);
o
.
jio
=
JIO
.
newJio
({
"
type
"
:
"
dav
"
,
"
username
"
:
"
davput
"
,
"
password
"
:
"
checkpwd
"
,
"
url
"
:
"
https://ca-davstorage:8080
"
});
// putAttachment without doc id => id required
o
.
spy
(
o
,
"
status
"
,
20
,
"
PutAttachment without doc id
"
);
o
.
jio
.
putAttachment
({},
o
.
f
);
o
.
clock
.
tick
(
5000
);
// putAttachment without attachment id => attachment id required
o
.
spy
(
o
,
"
status
"
,
22
,
"
PutAttachment without attachment id
"
);
o
.
jio
.
putAttachment
({
"
id
"
:
"
putattmt1
"
},
o
.
f
);
o
.
clock
.
tick
(
5000
);
// putAttachment without underlying document => not found
o
.
addFakeServerResponse
(
"
GET
"
,
"
putattmtx
"
,
404
,
"
HTML RESPONSE
"
);
o
.
spy
(
o
,
"
status
"
,
404
,
"
PutAttachment without document
"
);
o
.
jio
.
putAttachment
({
"
id
"
:
"
putattmtx/putattmt2
"
},
o
.
f
);
o
.
clock
.
tick
(
5000
);
o
.
server
.
respond
();
// putAttachment with document without data
o
.
answer
=
JSON
.
stringify
({
"
_id
"
:
"
putattmt1
"
,
"
title
"
:
"
myPutAttm1
"
});
o
.
addFakeServerResponse
(
"
GET
"
,
"
putattmt1
"
,
200
,
o
.
answer
);
o
.
addFakeServerResponse
(
"
PUT
"
,
"
putattmt1
"
,
201
,
"
HTML RESPONSE
"
);
o
.
addFakeServerResponse
(
"
PUT
"
,
"
putattmt1/putattmt2
"
,
201
,
"
HTML RESPONSE
"
);
o
.
spy
(
o
,
"
value
"
,
{
"
ok
"
:
true
,
"
id
"
:
"
putattmt1/putattmt2
"
},
"
PutAttachment with document, without data
"
);
o
.
jio
.
putAttachment
({
"
id
"
:
"
putattmt1/putattmt2
"
},
o
.
f
);
o
.
clock
.
tick
(
5000
);
o
.
server
.
respond
();
// check document
// check attachment
// update attachment
o
.
answer
=
JSON
.
stringify
({
"
_id
"
:
"
putattmt1
"
,
"
title
"
:
"
myPutAttm1
"
});
o
.
addFakeServerResponse
(
"
GET
"
,
"
putattmt1
"
,
200
,
o
.
answer
);
o
.
addFakeServerResponse
(
"
PUT
"
,
"
putattmt1
"
,
201
,
"
HTML RESPONSE
"
);
o
.
addFakeServerResponse
(
"
PUT
"
,
"
putattmt1/putattmt2
"
,
201
,
"
HTML RESPONSE
"
);
o
.
spy
(
o
,
"
value
"
,
{
"
ok
"
:
true
,
"
id
"
:
"
putattmt1/putattmt2
"
},
"
Update Attachment, with data
"
);
o
.
jio
.
putAttachment
({
"
id
"
:
"
putattmt1/putattmt2
"
,
"
data
"
:
"
abc
"
},
o
.
f
);
o
.
clock
.
tick
(
5000
);
o
.
server
.
respond
();
// check document
// check attachment
o
.
jio
.
stop
();
// do the same tests live webDav-Server/simulate CORS
// check for credentials in sinon
});
/*
/*
// note: http errno:
// note: http errno:
// 200 OK
// 200 OK
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment