Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature addition: skipIISCustomErrors #568

Open
wants to merge 22 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e9f7781
Merge pull request #34 from tjanczuk/master
rramachand21 Apr 11, 2016
83879df
iisnode-debug.html
rramachand21 Apr 21, 2016
5a1dba6
Update iisnode-debug.html
rramachand21 Apr 21, 2016
4d633ee
Rename iisnode-debug.html to index.html
rramachand21 Apr 21, 2016
b3058d6
Fix env variables allocation issue
rramachand21-zz Jun 9, 2016
8f9d43a
fix w3wp crashes
rramachand21-zz Feb 19, 2017
9b05ea4
node sticky sessions fix
rramachand21-zz Feb 19, 2017
1183694
Increase version to 0.2.24
rramachand21-zz Feb 19, 2017
2c5c85f
Fix w3wp crash when flushResponse=true
rramachand21-zz Feb 20, 2017
da4e5e1
Increase version to 0.2.25
rramachand21-zz Feb 20, 2017
1bf74c5
Fix context RefCount when debugger is enabled
rramachand21-zz Feb 21, 2017
c53c71e
Fix context RefCount when debugger is enabled v0.2.26
rramachand21-zz Feb 21, 2017
6478fde
Fix context RefCount when debugger is enabled v0.2.26
rramachand21-zz Feb 21, 2017
9f49752
Set fTrySkipCustomErrors flag to TRUE
Apr 6, 2017
b0a9bec
Add opt-in skipIISCustomErrors switch to iisnode configuration.
Apr 8, 2017
7ad8add
Remove skipIISCustomErrors behavior from SendEmptyResponse
Apr 9, 2017
561b1f2
Add documentation of skipIISCustomErrors to samples
Apr 9, 2017
3d668d5
Create tests for skipIISCustomErrors
Apr 9, 2017
6487214
Fix indentation discrepancies.
Apr 9, 2017
d8f9f59
iisnode crash fix
JennyLawrance Jan 17, 2018
7cb4810
Merge pull request #49 from JennyLawrance/master
rramachand21 Jan 17, 2018
3b2acd5
Merge remote-tracking branch 'azure/master'
Oct 1, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 164 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
<!DOCTYPE html>
<html>
<head>
<title>iisnode-debug</title>
<style type="text/css">
body
{
font-family: Arial, Helvetica, sans-serif;
}
table
{
border-collapse: collapse;
}
td, th
{
border: none;
padding: 3px 7px 2px 7px;
}
th
{
text-align: left;
padding-top: 5px;
padding-bottom: 4px;
background-color: Gray;
color: #ffffff;
}
td.value
{
text-align: right
}
</style>
</head>
<body>
<h2>HTTP response diagnostics for iisnode</h2>

<h3>This request</h3>

<table>
<tr>
<td>Processing time [ms]</td>
<td id="req_time" class="value">N/A</td>
</tr>
<tr>
<td>Named pipe connection retry count</td>
<td id="np_retry" class="value">N/A</td>
</tr>
<tr>
<td>HRESULT</td>
<td id="hresult" class="value">N/A</td>
</tr>
<tr>
<td>Server DNS name</td>
<td id="dns" class="value">N/A</td>
</tr>
<tr>
<td>w3wp.exe PID</td>
<td id="worker_pid" class="value">N/A</td>
</tr>
<tr>
<td>node.exe PID</td>
<td id="node_pid" class="value">N/A</td>
</tr>
</table>

<h3>Memory</h3>

<img id="memoryChart" src="" width="400px" height="300px" alt="Memory consumption chart" />

<h3>Counters</h3>

<table>
<tr>
<td>Active node.exe processes serving this application</td>
<td id="app_processes" class="value">N/A</td>
</tr>
<tr>
<td>Active HTTP requests in this application</td>
<td id="app_active_req" class="value">N/A</td>
</tr>
<tr>
<td>Active HTTP requests in this node.exe process</td>
<td id="process_active_req" class="value">N/A</td>
</tr>
<tr>
<td>Total node.js requests processed by w3wp.exe</td>
<td id="worker_total_req" class="value">N/A</td>
</tr>
</table>

<h3>Environment</h3>

<table>
<tr>
<td>Version of iisnode</td>
<td id="iisnode_ver" class="value">N/A</td>
</tr>
<tr>
<td>Server full DNS name</td>
<td id="dns_full" class="value">N/A</td>
</tr>
<tr>
<td>Full node.exe path</td>
<td id="node" class="value">N/A</td>
</tr>
</table>

<h3>Actions</h3>

<a href="https://github.com/tjanczuk/issues/new">Bugs, feedback, questions</a><br />
<a href="https://github.com/tjanczuk/iisnode">iisnode project home page</a><br />
<a href="http://tomasz.janczuk.org/2011/11/debug-nodejs-applications-on-windows.html">
Debug node.js applications hosted in IIS using iisnode
</a><br />
<a href="http://tomasz.janczuk.org/2011/09/using-event-tracing-for-windows-to.html">
Use Event Tracing for Windows (ETW) to get more diagnostics information
</a><br />
<a href="http://www.windowsazure.com/en-us/develop/nodejs/">
Windows Azure node.js developer center
</a>

<script type="text/javascript">

var memoryChartTemplate =
'http://chart.apis.google.com/chart?chxl=1:|w3wp.exe|node.exe|2:|%5BKB%5D&chxp=2,50&chxr=0,0,#MAX#'
+ '&chxs=0,676767,9.833,0,lt,676767|1,676767,11.5,0,l,00000000&chxt=y,x,y&chbh=a,4,25&chs=400x300&cht=bvg'
+ '&chco=80C65A,FF9900&chds=0,#MAX#,0,#MAX#&chd=t:#WS#|#PAGE#&chdl=working+set|pagefile&chdlp=b'
+ '&chma=0,0,0,2|0,7&chtt=Memory+usage&chts=000000,11.5&chm=N,676767,0,-1,11|N,676767,1,-1,11';

// parse data from fragment

var fragment = window.location.hash.substring(1);
var data = {};
fragment.split('&').forEach(function (item) {
var i = item.indexOf('=');
data[item.substring(0, i)] = item.substring(i + 1);
});

data.dns_full = data.dns;

// create memory chart URL

var max = Math.max(data.node_mem_ws, data.node_mem_pagefile, data.worker_mem_ws, data.worker_mem_pagefile);
max = (Math.floor(max / 1000) + 1) * 1000;
var chartUrl = memoryChartTemplate
.replace(/#MAX#/g, max)
.replace('#WS#', data.worker_mem_ws + ',' + data.node_mem_ws)
.replace('#PAGE#', data.worker_mem_pagefile + ',' + data.node_mem_pagefile);

document.getElementById('memoryChart').setAttribute('src', chartUrl);

// fill out other pieces of data

for (var piece in data) {
var elem = document.getElementById(piece);
if (elem) {
elem.innerHTML = (piece === 'dns' && data[piece].indexOf('.') > 0)
? data[piece].substring(0, data[piece].indexOf('.'))
: data[piece];
}
}

</script>
</body>
</html>
4 changes: 3 additions & 1 deletion src/config/iisnode_dev_x64.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Details at http://learn.iis.net/page.aspx/241/configuration-extensibility/
<attribute name="nodeProcessCountPerApplication" type="uint" defaultValue="1"/>
<attribute name="nodeProcessCommandLine" type="string" expanded="true" defaultValue="node.exe"/>
<attribute name="interceptor" type="string" expanded="true" defaultValue="&quot;%programfiles(x86)%\iisnode-dev\release\x64\interceptor.js&quot;" />
<attribute name="maxConcurrentRequestsPerProcess" type="uint" allowInfitnite="true" defaultValue="1024"/>
<attribute name="maxConcurrentRequestsPerProcess" type="uint" allowInfinite="true" defaultValue="1024"/>
<attribute name="maxNamedPipeConnectionRetry" type="uint" defaultValue="100"/>
<attribute name="namedPipeConnectionRetryDelay" type="uint" defaultValue="250"/>
<attribute name="maxNamedPipeConnectionPoolSize" type="uint" defaultValue="512"/>
Expand Down Expand Up @@ -60,5 +60,7 @@ Details at http://learn.iis.net/page.aspx/241/configuration-extensibility/
<attribute name="configOverrides" type="string" expanded="true" defaultValue="iisnode.yml"/>
<attribute name="recycleSignalEnabled" type="bool" defaultValue="false"/>
<attribute name="idlePageOutTimePeriod" type="uint" defaultValue="0" /> <!-- disabled with default value 0 -->
<attribute name="skipIISCustomErrors" type="bool" defaultValue="false" />
<attribute name="nodeProcessStickySessions" type="bool" defaultValue="false"/>
</sectionSchema>
</configSchema>
4 changes: 3 additions & 1 deletion src/config/iisnode_dev_x86_on_x64.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Details at http://learn.iis.net/page.aspx/241/configuration-extensibility/
<attribute name="nodeProcessCountPerApplication" type="uint" defaultValue="1"/>
<attribute name="nodeProcessCommandLine" type="string" expanded="true" defaultValue="node.exe"/>
<attribute name="interceptor" type="string" expanded="true" defaultValue="&quot;%programfiles(x86)%\iisnode-dev\release\x86\interceptor.js&quot;" />
<attribute name="maxConcurrentRequestsPerProcess" type="uint" allowInfitnite="true" defaultValue="1024"/>
<attribute name="maxConcurrentRequestsPerProcess" type="uint" allowInfinite="true" defaultValue="1024"/>
<attribute name="maxNamedPipeConnectionRetry" type="uint" defaultValue="100"/>
<attribute name="namedPipeConnectionRetryDelay" type="uint" defaultValue="250"/>
<attribute name="maxNamedPipeConnectionPoolSize" type="uint" defaultValue="512"/>
Expand Down Expand Up @@ -60,5 +60,7 @@ Details at http://learn.iis.net/page.aspx/241/configuration-extensibility/
<attribute name="configOverrides" type="string" expanded="true" defaultValue="iisnode.yml"/>
<attribute name="recycleSignalEnabled" type="bool" defaultValue="false"/>
<attribute name="idlePageOutTimePeriod" type="uint" defaultValue="0" /> <!-- disabled with default value 0 -->
<attribute name="skipIISCustomErrors" type="bool" defaultValue="false" />
<attribute name="nodeProcessStickySessions" type="bool" defaultValue="false"/>
</sectionSchema>
</configSchema>
4 changes: 3 additions & 1 deletion src/config/iisnode_dev_x86_on_x86.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Details at http://learn.iis.net/page.aspx/241/configuration-extensibility/
<attribute name="nodeProcessCountPerApplication" type="uint" defaultValue="1"/>
<attribute name="nodeProcessCommandLine" type="string" expanded="true" defaultValue="node.exe"/>
<attribute name="interceptor" type="string" expanded="true" defaultValue="&quot;%programfiles%\iisnode-dev\release\x86\interceptor.js&quot;" />
<attribute name="maxConcurrentRequestsPerProcess" type="uint" allowInfitnite="true" defaultValue="1024"/>
<attribute name="maxConcurrentRequestsPerProcess" type="uint" allowInfinite="true" defaultValue="1024"/>
<attribute name="maxNamedPipeConnectionRetry" type="uint" defaultValue="100"/>
<attribute name="namedPipeConnectionRetryDelay" type="uint" defaultValue="250"/>
<attribute name="maxNamedPipeConnectionPoolSize" type="uint" defaultValue="512"/>
Expand Down Expand Up @@ -60,5 +60,7 @@ Details at http://learn.iis.net/page.aspx/241/configuration-extensibility/
<attribute name="configOverrides" type="string" expanded="true" defaultValue="iisnode.yml"/>
<attribute name="recycleSignalEnabled" type="bool" defaultValue="false"/>
<attribute name="idlePageOutTimePeriod" type="uint" defaultValue="0" /> <!-- disabled with default value 0 -->
<attribute name="skipIISCustomErrors" type="bool" defaultValue="false" />
<attribute name="nodeProcessStickySessions" type="bool" defaultValue="false"/>
</sectionSchema>
</configSchema>
4 changes: 3 additions & 1 deletion src/config/iisnode_express_schema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Details at http://learn.iis.net/page.aspx/241/configuration-extensibility/
<attribute name="nodeProcessCountPerApplication" type="uint" defaultValue="1"/>
<attribute name="nodeProcessCommandLine" type="string" expanded="true" defaultValue="node.exe"/>
<attribute name="interceptor" type="string" expanded="true" defaultValue="&quot;%programfiles%\iisnode-express\interceptor.js&quot;" />
<attribute name="maxConcurrentRequestsPerProcess" type="uint" allowInfitnite="true" defaultValue="1024"/>
<attribute name="maxConcurrentRequestsPerProcess" type="uint" allowInfinite="true" defaultValue="1024"/>
<attribute name="maxNamedPipeConnectionRetry" type="uint" defaultValue="100"/>
<attribute name="namedPipeConnectionRetryDelay" type="uint" defaultValue="250"/>
<attribute name="maxNamedPipeConnectionPoolSize" type="uint" defaultValue="512"/>
Expand Down Expand Up @@ -60,5 +60,7 @@ Details at http://learn.iis.net/page.aspx/241/configuration-extensibility/
<attribute name="configOverrides" type="string" expanded="true" defaultValue="iisnode.yml"/>
<attribute name="recycleSignalEnabled" type="bool" defaultValue="false"/>
<attribute name="idlePageOutTimePeriod" type="uint" defaultValue="0" /> <!-- disabled with default value 0 -->
<attribute name="skipIISCustomErrors" type="bool" defaultValue="false" />
<attribute name="nodeProcessStickySessions" type="bool" defaultValue="false"/>
</sectionSchema>
</configSchema>
4 changes: 3 additions & 1 deletion src/config/iisnode_express_schema_x64.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Details at http://learn.iis.net/page.aspx/241/configuration-extensibility/
<attribute name="nodeProcessCountPerApplication" type="uint" defaultValue="1"/>
<attribute name="nodeProcessCommandLine" type="string" expanded="true" defaultValue="node.exe"/>
<attribute name="interceptor" type="string" expanded="true" defaultValue="&quot;%programfiles(x86)%\iisnode-express\interceptor.js&quot;" />
<attribute name="maxConcurrentRequestsPerProcess" type="uint" allowInfitnite="true" defaultValue="1024"/>
<attribute name="maxConcurrentRequestsPerProcess" type="uint" allowInfinite="true" defaultValue="1024"/>
<attribute name="maxNamedPipeConnectionRetry" type="uint" defaultValue="100"/>
<attribute name="namedPipeConnectionRetryDelay" type="uint" defaultValue="250"/>
<attribute name="maxNamedPipeConnectionPoolSize" type="uint" defaultValue="512"/>
Expand Down Expand Up @@ -60,5 +60,7 @@ Details at http://learn.iis.net/page.aspx/241/configuration-extensibility/
<attribute name="configOverrides" type="string" expanded="true" defaultValue="iisnode.yml"/>
<attribute name="recycleSignalEnabled" type="bool" defaultValue="false"/>
<attribute name="idlePageOutTimePeriod" type="uint" defaultValue="0" /> <!-- disabled with default value 0 -->
<attribute name="skipIISCustomErrors" type="bool" defaultValue="false" />
<attribute name="nodeProcessStickySessions" type="bool" defaultValue="false"/>
</sectionSchema>
</configSchema>
4 changes: 3 additions & 1 deletion src/config/iisnode_schema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Details at http://learn.iis.net/page.aspx/241/configuration-extensibility/
<attribute name="nodeProcessCountPerApplication" type="uint" defaultValue="1"/>
<attribute name="nodeProcessCommandLine" type="string" expanded="true" defaultValue="node.exe"/>
<attribute name="interceptor" type="string" expanded="true" defaultValue="&quot;%programfiles%\iisnode\interceptor.js&quot;" />
<attribute name="maxConcurrentRequestsPerProcess" type="uint" allowInfitnite="true" defaultValue="1024"/>
<attribute name="maxConcurrentRequestsPerProcess" type="uint" allowInfinite="true" defaultValue="1024"/>
<attribute name="maxNamedPipeConnectionRetry" type="uint" defaultValue="100"/>
<attribute name="namedPipeConnectionRetryDelay" type="uint" defaultValue="250"/>
<attribute name="maxNamedPipeConnectionPoolSize" type="uint" defaultValue="512"/>
Expand Down Expand Up @@ -60,5 +60,7 @@ Details at http://learn.iis.net/page.aspx/241/configuration-extensibility/
<attribute name="configOverrides" type="string" expanded="true" defaultValue="iisnode.yml"/>
<attribute name="recycleSignalEnabled" type="bool" defaultValue="false"/>
<attribute name="idlePageOutTimePeriod" type="uint" defaultValue="0" /> <!-- disabled with default value 0 -->
<attribute name="skipIISCustomErrors" type="bool" defaultValue="false" />
<attribute name="nodeProcessStickySessions" type="bool" defaultValue="false"/>
</sectionSchema>
</configSchema>
4 changes: 3 additions & 1 deletion src/config/iisnode_schema_x64.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Details at http://learn.iis.net/page.aspx/241/configuration-extensibility/
<attribute name="nodeProcessCountPerApplication" type="uint" defaultValue="1"/>
<attribute name="nodeProcessCommandLine" type="string" expanded="true" defaultValue="node.exe"/>
<attribute name="interceptor" type="string" expanded="true" defaultValue="&quot;%programfiles%\iisnode\interceptor.js&quot;" />
<attribute name="maxConcurrentRequestsPerProcess" type="uint" allowInfitnite="true" defaultValue="1024"/>
<attribute name="maxConcurrentRequestsPerProcess" type="uint" allowInfinite="true" defaultValue="1024"/>
<attribute name="maxNamedPipeConnectionRetry" type="uint" defaultValue="100"/>
<attribute name="namedPipeConnectionRetryDelay" type="uint" defaultValue="250"/>
<attribute name="maxNamedPipeConnectionPoolSize" type="uint" defaultValue="512"/>
Expand Down Expand Up @@ -60,5 +60,7 @@ Details at http://learn.iis.net/page.aspx/241/configuration-extensibility/
<attribute name="configOverrides" type="string" expanded="true" defaultValue="iisnode.yml"/>
<attribute name="recycleSignalEnabled" type="bool" defaultValue="false"/>
<attribute name="idlePageOutTimePeriod" type="uint" defaultValue="0" /> <!-- disabled with default value 0 -->
<attribute name="skipIISCustomErrors" type="bool" defaultValue="false"/>"
<attribute name="nodeProcessStickySessions" type="bool" defaultValue="false"/>
</sectionSchema>
</configSchema>
33 changes: 26 additions & 7 deletions src/iisnode/casyncmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ extern RtlNtStatusToDosError pRtlNtStatusToDosError;

void ASYNC_CONTEXT::RunSynchronousContinuations()
{
while (this->continueSynchronously)
BOOL fCompletionPosted = FALSE;
while (!fCompletionPosted && this->continueSynchronously)
{
// The continueSynchronously is used to unwind the call stack
// to avoid stack overflow in case of a synchronous IO completions
this->continueSynchronously = FALSE;
DWORD bytesCompleteted = this->bytesCompleteted;
this->bytesCompleteted = 0;
this->completionProcessor(S_OK, bytesCompleteted, (LPOVERLAPPED)this);
this->completionProcessor(S_OK, bytesCompleteted, (LPOVERLAPPED)this, &fCompletionPosted);
}
}

Expand Down Expand Up @@ -171,19 +172,31 @@ unsigned int WINAPI CAsyncManager::Worker(void* arg)
{
OVERLAPPED_ENTRY* entry = entries;
for (int i = 0; i < entriesRemoved; i++)
{
{
BOOL fCompletionPosted = FALSE;

if (0L == entry->lpCompletionKey
&& NULL != (ctx = (ASYNC_CONTEXT*)entry->lpOverlapped)
&& NULL != ctx->completionProcessor) // regular IO completion - invoke custom processor
{

error = (entry->lpOverlapped->Internal == STATUS_SUCCESS) ? ERROR_SUCCESS
: pRtlNtStatusToDosError(entry->lpOverlapped->Internal);
ctx = (ASYNC_CONTEXT*)entry->lpOverlapped;

ctx->completionProcessor(
(0 == entry->dwNumberOfBytesTransferred && ERROR_SUCCESS == error) ? ERROR_NO_DATA : error,
entry->dwNumberOfBytesTransferred,
(LPOVERLAPPED)ctx);
ctx->RunSynchronousContinuations();
(LPOVERLAPPED)ctx,
&fCompletionPosted);

if(!fCompletionPosted)
{
ctx->RunSynchronousContinuations();
}

CNodeHttpStoredContext* storedCtx = (CNodeHttpStoredContext*)ctx->data;
storedCtx->DereferenceNodeHttpStoredContext();
}
else if (-1L == entry->lpCompletionKey) // shutdown initiated from Terminate
{
Expand All @@ -194,8 +207,14 @@ unsigned int WINAPI CAsyncManager::Worker(void* arg)
if (-2L == entry->lpCompletionKey) // completion of an alertable wait state timer initialized from OnTimer
{
ctx = (ASYNC_CONTEXT*)entry->lpOverlapped;
ctx->completionProcessor(S_OK, 0, (LPOVERLAPPED)ctx);
ctx->RunSynchronousContinuations();
ctx->completionProcessor(S_OK, 0, (LPOVERLAPPED)ctx, &fCompletionPosted);
if(!fCompletionPosted)
{
ctx->RunSynchronousContinuations();
}

CNodeHttpStoredContext* storedCtx = (CNodeHttpStoredContext*)ctx->data;
storedCtx->DereferenceNodeHttpStoredContext();
}
else if (-3L == entry->lpCompletionKey) // continuation initiated form PostContinuation
{
Expand Down
11 changes: 10 additions & 1 deletion src/iisnode/casyncmanager.h
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
#ifndef __CASYNCMANAGER_H__
#define __CASYNCMANAGER_H__

typedef
VOID
(WINAPI *LPOVERLAPPED_COMPLETION_ROUTINE_IISNODE)(
_In_ DWORD dwErrorCode,
_In_ DWORD dwNumberOfBytesTransfered,
_Inout_ LPOVERLAPPED lpOverlapped,
_Inout_ BOOL * fCompletionPosted
);

typedef struct {
OVERLAPPED overlapped; // this member must be first in the struct
LPOVERLAPPED_COMPLETION_ROUTINE completionProcessor;
LPOVERLAPPED_COMPLETION_ROUTINE_IISNODE completionProcessor;
BOOL continueSynchronously;
void* data;
HANDLE timer;
Expand Down
15 changes: 14 additions & 1 deletion src/iisnode/chttpprotocol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,20 @@ HRESULT CHttpProtocol::ParseResponseStatusLine(CNodeHttpStoredContext* context)
data[newOffset] = 0; // zero-terminate the reason phrase to reuse it without copying

IHttpResponse* response = context->GetHttpContext()->GetResponse();
response->SetStatus(statusCode, data + offset, subStatusCode);

if (CModuleConfiguration::GetSkipIISCustomErrors(context->GetHttpContext()))
{
// set fTrySkipCustomErrors so that error responses sent back from the node app through iisnode
// are passed through to the client instead of being intercepted by IIS when httpErrors existingResponse="Auto"
// this allows a mixed solution where custom error pages can be provided via IIS for errors that occur outside
// of iisnode's purview, while also allowing usually-more-helpful error responses from the node application
// to be passed through to the client rather than being intercepted by IIS.
response->SetStatus(statusCode, data + offset, subStatusCode, S_OK, NULL, TRUE);
}
else
{
response->SetStatus(statusCode, data + offset, subStatusCode);
}

// adjust buffers

Expand Down
Loading