Skip to content

Commit de17f3c

Browse files
committed
fix #562 write Content-Length 0 for non GET/HEAD requests that have no body
1 parent 2675d79 commit de17f3c

File tree

3 files changed

+24
-13
lines changed

3 files changed

+24
-13
lines changed

Diff for: src/Elasticsearch.Net/Connection/HttpConnection.cs

+19-11
Original file line numberDiff line numberDiff line change
@@ -71,46 +71,46 @@ public virtual ElasticsearchResponse<Stream> DeleteSync(Uri uri, byte[] data, IR
7171

7272
private ElasticsearchResponse<Stream> HeaderOnlyRequest(Uri uri, string method, IRequestConnectionConfiguration requestSpecificConfig)
7373
{
74-
var r = this.CreateHttpWebRequest(uri, method, requestSpecificConfig);
74+
var r = this.CreateHttpWebRequest(uri, method, null, requestSpecificConfig);
7575
return this.DoSynchronousRequest(r, requestSpecificConfig: requestSpecificConfig);
7676
}
7777

7878
private ElasticsearchResponse<Stream> BodyRequest(Uri uri, byte[] data, string method, IRequestConnectionConfiguration requestSpecificConfig)
7979
{
80-
var r = this.CreateHttpWebRequest(uri, method, requestSpecificConfig);
80+
var r = this.CreateHttpWebRequest(uri, method, data, requestSpecificConfig);
8181
return this.DoSynchronousRequest(r, data, requestSpecificConfig);
8282
}
8383

8484
public virtual Task<ElasticsearchResponse<Stream>> Get(Uri uri, IRequestConnectionConfiguration requestSpecificConfig = null)
8585
{
86-
var r = this.CreateHttpWebRequest(uri, "GET", requestSpecificConfig);
86+
var r = this.CreateHttpWebRequest(uri, "GET", null, requestSpecificConfig);
8787
return this.DoAsyncRequest(r, requestSpecificConfig: requestSpecificConfig);
8888
}
8989
public virtual Task<ElasticsearchResponse<Stream>> Head(Uri uri, IRequestConnectionConfiguration requestSpecificConfig = null)
9090
{
91-
var r = this.CreateHttpWebRequest(uri, "HEAD", requestSpecificConfig);
91+
var r = this.CreateHttpWebRequest(uri, "HEAD", null, requestSpecificConfig);
9292
return this.DoAsyncRequest(r, requestSpecificConfig: requestSpecificConfig);
9393
}
9494
public virtual Task<ElasticsearchResponse<Stream>> Post(Uri uri, byte[] data, IRequestConnectionConfiguration requestSpecificConfig = null)
9595
{
96-
var r = this.CreateHttpWebRequest(uri, "POST", requestSpecificConfig);
96+
var r = this.CreateHttpWebRequest(uri, "POST", data, requestSpecificConfig);
9797
return this.DoAsyncRequest(r, data, requestSpecificConfig: requestSpecificConfig);
9898
}
9999

100100
public virtual Task<ElasticsearchResponse<Stream>> Put(Uri uri, byte[] data, IRequestConnectionConfiguration requestSpecificConfig = null)
101101
{
102-
var r = this.CreateHttpWebRequest(uri, "PUT", requestSpecificConfig);
102+
var r = this.CreateHttpWebRequest(uri, "PUT", data, requestSpecificConfig);
103103
return this.DoAsyncRequest(r, data, requestSpecificConfig: requestSpecificConfig);
104104
}
105105

106106
public virtual Task<ElasticsearchResponse<Stream>> Delete(Uri uri, byte[] data, IRequestConnectionConfiguration requestSpecificConfig = null)
107107
{
108-
var r = this.CreateHttpWebRequest(uri, "DELETE", requestSpecificConfig);
108+
var r = this.CreateHttpWebRequest(uri, "DELETE", data, requestSpecificConfig);
109109
return this.DoAsyncRequest(r, data, requestSpecificConfig: requestSpecificConfig);
110110
}
111111
public virtual Task<ElasticsearchResponse<Stream>> Delete(Uri uri, IRequestConnectionConfiguration requestSpecificConfig = null)
112112
{
113-
var r = this.CreateHttpWebRequest(uri, "DELETE", requestSpecificConfig);
113+
var r = this.CreateHttpWebRequest(uri, "DELETE", null, requestSpecificConfig);
114114
return this.DoAsyncRequest(r, requestSpecificConfig: requestSpecificConfig);
115115
}
116116

@@ -127,9 +127,9 @@ private static void ThreadTimeoutCallback(object state, bool timedOut)
127127
}
128128

129129

130-
protected virtual HttpWebRequest CreateHttpWebRequest(Uri uri, string method, IRequestConnectionConfiguration requestSpecificConfig)
130+
protected virtual HttpWebRequest CreateHttpWebRequest(Uri uri, string method, byte[] data, IRequestConnectionConfiguration requestSpecificConfig)
131131
{
132-
var myReq = this.CreateWebRequest(uri, method, requestSpecificConfig);
132+
var myReq = this.CreateWebRequest(uri, method, data, requestSpecificConfig);
133133
this.SetBasicAuthorizationIfNeeded(myReq);
134134
this.SetProxyIfNeeded(myReq);
135135
return myReq;
@@ -160,7 +160,7 @@ private void SetBasicAuthorizationIfNeeded(HttpWebRequest myReq)
160160
//}
161161
}
162162

163-
protected virtual HttpWebRequest CreateWebRequest(Uri uri, string method, IRequestConnectionConfiguration requestSpecificConfig)
163+
protected virtual HttpWebRequest CreateWebRequest(Uri uri, string method, byte[] data, IRequestConnectionConfiguration requestSpecificConfig)
164164
{
165165
//TODO append global querystring
166166
//var url = this._CreateUriString(path);
@@ -178,6 +178,14 @@ protected virtual HttpWebRequest CreateWebRequest(Uri uri, string method, IReque
178178
myReq.Timeout = timeout; // 1 minute timeout.
179179
myReq.ReadWriteTimeout = timeout; // 1 minute timeout.
180180
myReq.Method = method;
181+
182+
//WebRequest won't send Content-Length: 0 for empty bodies
183+
//which goes against RFC's and might break i.e IIS when used as a proxy.
184+
//see: https://github.com/elasticsearch/elasticsearch-net/issues/562
185+
var m = method.ToLower();
186+
if (m != "head" && m != "get" && (data == null || data.Length == 0))
187+
myReq.ContentLength = 0;
188+
181189
return myReq;
182190
}
183191

Diff for: src/Profiling/Profiling.Indexing/Program.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,12 @@ static void Main(string[] args)
2424
var baseThreadCount = process.Threads.Count;
2525
var baseMemorySize = process.VirtualMemorySize64;
2626

27+
var client = new ElasticClient(new ConnectionSettings(new Uri("http://ipv4.fiddler:9200"), "nest-default-index"));
2728
//warmer
2829
RunTest<HttpTester>(HTTP_PORT, 10);
30+
31+
client.Refresh();
32+
2933
Console.WriteLine("Warmed up caches press any key to index {0} messages", NUM_MESSAGES);
3034
Console.ReadLine();
3135
ConsoleKeyInfo key;
@@ -36,7 +40,6 @@ static void Main(string[] args)
3640

3741
RunIndex(baseThreadCount, baseMemorySize);
3842

39-
var client = new ElasticClient(new ConnectionSettings(new Uri("http://localhost:9200"), "nest-default-index"));
4043
client.DeleteIndex(d => d.Index(INDEX_PREFIX + "*"));
4144

4245
}

Diff for: src/Tests/Nest.Tests.Unit/Core/Domain/Connection/ConnectionTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public TestConnection(IConnectionSettingsValues settings)
1616

1717
public HttpWebRequest GetConnection(string path, string method)
1818
{
19-
return base.CreateHttpWebRequest(new Uri(new Uri("http://localhost"), path), method, null);
19+
return base.CreateHttpWebRequest(new Uri(new Uri("http://localhost"), path), method, null, null);
2020
}
2121
}
2222

0 commit comments

Comments
 (0)