Skip to content

Commit

Permalink
Changed the behavior of the server regarding the 'Content-Length' hea…
Browse files Browse the repository at this point in the history
…der in order to use the chunked version of a method everytime
  • Loading branch information
AdrienCastex committed Jun 14, 2017
1 parent ae0cf70 commit 0b675b0
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 148 deletions.
110 changes: 43 additions & 67 deletions lib/server/commands/Put.js
Original file line number Diff line number Diff line change
Expand Up @@ -138,83 +138,59 @@ unchunkedMethod.chunked = function (arg, callback) {
return;
}
arg.checkIfHeader(r, function () {
if (arg.contentLength === 0) {
if (r) {
arg.requirePrivilege(targetSource ? ['canSource', 'canWrite'] : ['canWrite'], r, function () {
r.write(targetSource, function (e, stream) { return process.nextTick(function () {
if (stream)
stream.end();
if (e)
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
else {
arg.invokeEvent('write', r);
arg.setCode(WebDAVRequest_1.HTTPCodes.OK);
}
callback();
}); });
});
return;
}
if (e) {
createResource(arg, callback, function (r) {
arg.setCode(WebDAVRequest_1.HTTPCodes.Created);
callback();
});
}
else {
if (e) {
createResource(arg, callback, function (r) {
r.write(targetSource, function (e, stream) { return process.nextTick(function () {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
arg.request.pipe(stream);
stream.on('finish', function (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.Created);
arg.invokeEvent('write', r);
callback();
});
stream.on('error', function (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
});
}); });
});
return;
}
arg.requirePrivilege(targetSource ? ['canSource', 'canWrite'] : ['canWrite'], r, function () {
r.type(function (e, type) { return process.nextTick(function () {
r.write(targetSource, function (e, stream) { return process.nextTick(function () {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
if (!type.isFile) {
arg.setCode(WebDAVRequest_1.HTTPCodes.MethodNotAllowed);
arg.request.pipe(stream);
stream.on('finish', function (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.Created);
arg.invokeEvent('write', r);
callback();
return;
}
r.write(targetSource, function (e, stream) { return process.nextTick(function () {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
arg.request.pipe(stream);
stream.on('finish', function (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.OK);
arg.invokeEvent('write', r);
callback();
});
stream.on('error', function (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
});
}); });
});
stream.on('error', function (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
});
}); });
});
return;
}
arg.requirePrivilege(targetSource ? ['canSource', 'canWrite'] : ['canWrite'], r, function () {
r.type(function (e, type) { return process.nextTick(function () {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
if (!type.isFile) {
arg.setCode(WebDAVRequest_1.HTTPCodes.MethodNotAllowed);
callback();
return;
}
r.write(targetSource, function (e, stream) { return process.nextTick(function () {
if (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
return;
}
arg.request.pipe(stream);
stream.on('finish', function (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.OK);
arg.invokeEvent('write', r);
callback();
});
stream.on('error', function (e) {
arg.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
callback();
});
}); });
}); });
});
});
});
};
2 changes: 1 addition & 1 deletion lib/server/webDAVServer/StartStop.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ function start(port, callback) {
base.response.end();
_this.invokeAfterRequest(base, null);
};
if (!_this.options.canChunk || !method.chunked || base.contentLength <= 0) {
if (!_this.options.canChunk || !method.chunked) {
var go_1 = function () {
_this.invokeBeforeRequest(base, function () {
method(base, base.exit);
Expand Down
128 changes: 49 additions & 79 deletions src/server/commands/Put.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,98 +172,68 @@ export default function unchunkedMethod(arg : MethodCallArgs, callback)
}

arg.checkIfHeader(r, () => {
if(arg.contentLength === 0)
{ // Create file
if(r)
{ // Resource exists => empty it
arg.requirePrivilege(targetSource ? [ 'canSource', 'canWrite' ] : [ 'canWrite' ], r, () => {
r.write(targetSource, (e, stream) => process.nextTick(() => {
if(stream)
stream.end();

if(e)
arg.setCode(HTTPCodes.InternalServerError)
else
{
arg.invokeEvent('write', r);
arg.setCode(HTTPCodes.OK)
}
callback()
}))
})
return;
}

if(e)
{ // Resource not found
createResource(arg, callback, (r) => {
arg.setCode(HTTPCodes.Created)
callback();
})
}
else
{ // Write to a file
if(e)
{ // Resource not found
createResource(arg, callback, (r) => {
r.write(targetSource, (e, stream) => process.nextTick(() => {
if(e)
{
arg.setCode(HTTPCodes.InternalServerError);
callback();
return;
}

arg.request.pipe(stream);
stream.on('finish', (e) => {
arg.setCode(HTTPCodes.Created)
arg.invokeEvent('write', r);
callback();
});
stream.on('error', (e) => {
arg.setCode(HTTPCodes.InternalServerError)
callback();
});
}))
})
return;
}

arg.requirePrivilege(targetSource ? [ 'canSource', 'canWrite' ] : [ 'canWrite' ], r, () => {
r.type((e, type) => process.nextTick(() => {
r.write(targetSource, (e, stream) => process.nextTick(() => {
if(e)
{
arg.setCode(HTTPCodes.InternalServerError);
callback();
return;
}
if(!type.isFile)

arg.request.pipe(stream);
stream.on('finish', (e) => {
arg.setCode(HTTPCodes.Created)
arg.invokeEvent('write', r);
callback();
});
stream.on('error', (e) => {
arg.setCode(HTTPCodes.InternalServerError)
callback();
});
}))
})
return;
}

arg.requirePrivilege(targetSource ? [ 'canSource', 'canWrite' ] : [ 'canWrite' ], r, () => {
r.type((e, type) => process.nextTick(() => {
if(e)
{
arg.setCode(HTTPCodes.InternalServerError);
callback();
return;
}
if(!type.isFile)
{
arg.setCode(HTTPCodes.MethodNotAllowed);
callback();
return;
}

r.write(targetSource, (e, stream) => process.nextTick(() => {
if(e)
{
arg.setCode(HTTPCodes.MethodNotAllowed);
arg.setCode(HTTPCodes.InternalServerError);
callback();
return;
}

r.write(targetSource, (e, stream) => process.nextTick(() => {
if(e)
{
arg.setCode(HTTPCodes.InternalServerError);
callback();
return;
}

arg.request.pipe(stream);
stream.on('finish', (e) => {
arg.setCode(HTTPCodes.OK)
arg.invokeEvent('write', r);
callback();
});
stream.on('error', (e) => {
arg.setCode(HTTPCodes.InternalServerError)
callback();
});
}))
arg.request.pipe(stream);
stream.on('finish', (e) => {
arg.setCode(HTTPCodes.OK)
arg.invokeEvent('write', r);
callback();
});
stream.on('error', (e) => {
arg.setCode(HTTPCodes.InternalServerError)
callback();
});
}))
})
}
}))
})
})
})
}
2 changes: 1 addition & 1 deletion src/server/webDAVServer/StartStop.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ export function start(port ?: number | WebDAVServerStartCallback, callback ?: We
this.invokeAfterRequest(base, null);
};

if(!this.options.canChunk || !method.chunked || base.contentLength <= 0)
if(!this.options.canChunk || !method.chunked)
{
const go = () =>
{
Expand Down

0 comments on commit 0b675b0

Please sign in to comment.