Skip to content

Commit

Permalink
fix: async function broke delayed responses (#200)
Browse files Browse the repository at this point in the history
* fix: async function broke delayed responses (#199)

* fix: reset delay after request

* fix: prevent validation from being a breaking change

* fix: improved handling of errors in response validation (#201)

* fix: async function broke delayed responses

* fix: improved handling of errors in response validation

* Remove demo link
  • Loading branch information
shubhendumadhukar committed Oct 29, 2022
1 parent 9da0049 commit b2aa306
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 45 deletions.
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
<img src="https://img.shields.io/github/repo-size/testinggospels/camouflage">
<img src="https://img.shields.io/bundlephobia/min/camouflage-server"><br/><br/>
<h3 align="center"><a href="https://testinggospels.github.io/camouflage/">Complete Documentation</a></h3>
<h3 align="center"><a href="http://camouflage-server.herokuapp.com/">Demo</a></h3>
</p>
</p>

Expand Down
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ const start = (
configLoader.validateAndLoad();
setLoaderInstance(configLoader);
const config: CamouflageConfig = getLoaderInstance().getConfig();
const validation = Validation.create(config.validation);
if (config.validation && config.validation.enable) Validation.create(config.validation);
// Set log level to the configured level from config.yaml
setLogLevel(config.loglevel);
logger.debug(JSON.stringify(config, null, 2));
Expand Down
67 changes: 36 additions & 31 deletions src/parser/HttpParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ const Handlebars = getHandlebars();
* 2. From matched directory get .mock file content and generate a response
*/

const sleep = (ms: number): Promise<void> => {
return new Promise((resolve) => setTimeout(resolve, ms));
};

export interface HttpParserResponse {
status: number;
body: string;
Expand Down Expand Up @@ -89,6 +93,7 @@ export class HttpParser {
}

response.status = parseFloat((<unknown>response.status) as string);
DELAY = 0;
return response;
};
/**
Expand Down Expand Up @@ -137,7 +142,9 @@ export class HttpParser {
}
const newLine = getNewLine(fileResponse);
const fileContent = fileResponse.trim().split(newLine);
fileContent.forEach((line: string, index: number) => {
for (let index = 0; index < fileContent.length; index++) {
const line = fileContent[index];

if (line === "") {
PARSE_BODY = true;
}
Expand Down Expand Up @@ -170,9 +177,8 @@ export class HttpParser {
if (responseBody.includes("camouflage_file_helper")) {
const fileResponse = responseBody.split(";")[1];
if (!fs.existsSync(fileResponse)) this.res.status(404);
setTimeout(() => {
this.res.sendFile(fileResponse);
}, DELAY);
await sleep(DELAY);
this.res.sendFile(fileResponse);
} else {
responseBody = responseBody.replace(/\s+/g, " ").trim();
responseBody = responseBody.replace(/{{{/, "{ {{");
Expand All @@ -191,10 +197,10 @@ export class HttpParser {
...codeResponse["headers"],
};
}
setTimeout(() => {
logger.debug(`Generated Response ${codeResponse["body"]}`);
response.body = codeResponse["body"];
});
await sleep(DELAY);
logger.debug(`Generated Response ${codeResponse["body"]}`);
response.body = codeResponse["body"];
return response;
break;
case "proxy":
/* eslint-disable no-case-declarations */
Expand Down Expand Up @@ -228,43 +234,42 @@ export class HttpParser {
}
break;
default:
setTimeout(async () => {
logger.debug(
`Generated Response ${await template({
request: this.req,
logger: logger,
})}`
);
response.body = await template({
await sleep(DELAY);
logger.debug(
`Generated Response ${await template({
request: this.req,
logger: logger,
});
}, DELAY);
})}`
);

response.body = await template({
request: this.req,
logger: logger,
});
return response;
break;
}
} catch (error) {
logger.warn(error.message);
setTimeout(async () => {
logger.debug(
`Generated Response ${await template({
request: this.req,
logger: logger,
})}`
);
response.body = await template({
await sleep(DELAY);
logger.debug(
`Generated Response ${await template({
request: this.req,
logger: logger,
});
console.log("yo");
}, DELAY);
})}`
);
response.body = await template({
request: this.req,
logger: logger,
});
return response;
}
response.body = responseBody;
}
PARSE_BODY = false;
responseBody = "";
DELAY = 0;
}
});
}
return response;
};
}
Expand Down
45 changes: 33 additions & 12 deletions src/validation/OpenApiAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,20 +123,41 @@ export default class OpenApiAdapter extends ValidationAdapter {
const currentRoute = this.findRoute(req);

if (currentRoute && currentRoute[method]) {
// check response
const responseValidator = new OpenAPIResponseValidator(
currentRoute[method]
);
try {
// check response
const responseValidator = new OpenAPIResponseValidator(
currentRoute[method]
);

const result = responseValidator.validateResponse(
response.status,
JSON.parse(response.body)
);
const result = responseValidator.validateResponse(
response.status,
JSON.parse(response.body)
);

if (result?.errors.length > 0) {
const error = createHttpError(
409,
new Error(JSON.stringify(result.errors, null, 2))
if (result?.errors.length > 0) {
const error = createHttpError(
409,
new Error(JSON.stringify(result.errors, null, 2))
);
return {
valid: false,
error,
};
}
} catch (err) {
const error = new createHttpError[500](
JSON.stringify(
[
{
path: "schema",
errorCode: "type.openapi.error",
message: err.message,
location: "schema",
},
],
null,
2
)
);
return {
valid: false,
Expand Down

0 comments on commit b2aa306

Please sign in to comment.