Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
6a380610
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
6a380610
编写于
9月 21, 2010
作者:
C
chegar
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6672144: HttpURLConnection.getInputStream sends POST request after failed chunked
Reviewed-by: michaelm
上级
c79c53a2
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
108 addition
and
5 deletion
+108
-5
src/share/classes/sun/net/www/http/HttpClient.java
src/share/classes/sun/net/www/http/HttpClient.java
+18
-4
src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
.../classes/sun/net/www/protocol/http/HttpURLConnection.java
+1
-1
test/sun/net/www/http/HttpClient/StreamingRetry.java
test/sun/net/www/http/HttpClient/StreamingRetry.java
+89
-0
未找到文件。
src/share/classes/sun/net/www/http/HttpClient.java
浏览文件 @
6a380610
...
...
@@ -55,6 +55,9 @@ public class HttpClient extends NetworkClient {
// Http data we send with the headers
PosterOutputStream
poster
=
null
;
// true if we are in streaming mode (fixed length or chunked)
boolean
streaming
;
// if we've had one io error
boolean
failedOnce
=
false
;
...
...
@@ -275,6 +278,10 @@ public class HttpClient extends NetworkClient {
ret
.
cachedHttpClient
=
true
;
assert
ret
.
inCache
;
ret
.
inCache
=
false
;
PlatformLogger
logger
=
HttpURLConnection
.
getHttpLogger
();
if
(
logger
.
isLoggable
(
PlatformLogger
.
FINEST
))
{
logger
.
finest
(
"KeepAlive stream retrieved from the cache, "
+
ret
);
}
}
}
else
{
// We cannot return this connection to the cache as it's
...
...
@@ -545,6 +552,13 @@ public class HttpClient extends NetworkClient {
serverOutput
.
flush
();
}
public
void
writeRequests
(
MessageHeader
head
,
PosterOutputStream
pos
,
boolean
streaming
)
throws
IOException
{
this
.
streaming
=
streaming
;
writeRequests
(
head
,
pos
);
}
/** Parse the first line of the HTTP request. It usually looks
something like: "HTTP/1.0 <number> comment\r\n". */
...
...
@@ -577,11 +591,11 @@ public class HttpClient extends NetworkClient {
closeServer
();
cachedHttpClient
=
false
;
if
(!
failedOnce
&&
requests
!=
null
)
{
if
(
httpuc
.
getRequestMethod
().
equals
(
"POST"
)
&&
!
retryPostProp
)
{
failedOnce
=
true
;
if
(
httpuc
.
getRequestMethod
().
equals
(
"POST"
)
&&
(!
retryPostProp
||
streaming
))
{
// do not retry the request
}
else
{
// try once more
failedOnce
=
true
;
openServer
();
if
(
needsTunneling
())
{
httpuc
.
doTunneling
();
...
...
@@ -684,10 +698,10 @@ public class HttpClient extends NetworkClient {
}
}
else
if
(
nread
!=
8
)
{
if
(!
failedOnce
&&
requests
!=
null
)
{
if
(
httpuc
.
getRequestMethod
().
equals
(
"POST"
)
&&
!
retryPostProp
)
{
failedOnce
=
true
;
if
(
httpuc
.
getRequestMethod
().
equals
(
"POST"
)
&&
(!
retryPostProp
||
streaming
))
{
// do not retry the request
}
else
{
failedOnce
=
true
;
closeServer
();
cachedHttpClient
=
false
;
openServer
();
...
...
src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
浏览文件 @
6a380610
...
...
@@ -494,7 +494,7 @@ public class HttpURLConnection extends java.net.HttpURLConnection {
if
(
logger
.
isLoggable
(
PlatformLogger
.
FINE
))
{
logger
.
fine
(
requests
.
toString
());
}
http
.
writeRequests
(
requests
,
poster
);
http
.
writeRequests
(
requests
,
poster
,
streaming
()
);
if
(
ps
.
checkError
())
{
String
proxyHost
=
http
.
getProxyHostUsed
();
int
proxyPort
=
http
.
getProxyPortUsed
();
...
...
test/sun/net/www/http/HttpClient/StreamingRetry.java
0 → 100644
浏览文件 @
6a380610
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 6672144
* @summary HttpURLConnection.getInputStream sends POST request after failed chunked send
*/
import
java.net.HttpURLConnection
;
import
java.net.ServerSocket
;
import
java.net.URL
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.OutputStream
;
public
class
StreamingRetry
implements
Runnable
{
static
final
int
ACCEPT_TIMEOUT
=
20
*
1000
;
// 20 seconds
ServerSocket
ss
;
public
static
void
main
(
String
[]
args
)
throws
IOException
{
(
new
StreamingRetry
()).
instanceMain
();
}
void
instanceMain
()
throws
IOException
{
test
();
if
(
failed
>
0
)
throw
new
RuntimeException
(
"Some tests failed"
);
}
void
test
()
throws
IOException
{
ss
=
new
ServerSocket
(
0
);
ss
.
setSoTimeout
(
ACCEPT_TIMEOUT
);
int
port
=
ss
.
getLocalPort
();
(
new
Thread
(
this
)).
start
();
try
{
URL
url
=
new
URL
(
"http://localhost:"
+
port
+
"/"
);
HttpURLConnection
uc
=
(
HttpURLConnection
)
url
.
openConnection
();
uc
.
setDoOutput
(
true
);
uc
.
setChunkedStreamingMode
(
4096
);
OutputStream
os
=
uc
.
getOutputStream
();
os
.
write
(
"Hello there"
.
getBytes
());
InputStream
is
=
uc
.
getInputStream
();
is
.
close
();
}
catch
(
IOException
expected
)
{
//expected.printStackTrace();
}
finally
{
ss
.
close
();
}
}
// Server
public
void
run
()
{
try
{
(
ss
.
accept
()).
close
();
(
ss
.
accept
()).
close
();
ss
.
close
();
fail
(
"The server shouldn't accept a second connection"
);
}
catch
(
IOException
e
)
{
//OK, the clien will close the server socket if successfull
}
}
volatile
int
failed
=
0
;
void
fail
()
{
failed
++;
Thread
.
dumpStack
();}
void
fail
(
String
msg
)
{
System
.
err
.
println
(
msg
);
fail
();}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录