Tag: http

HTTP 1.1流水线

我必须在Java中实现HTTP客户端,并且对于我的需求,似乎最有效的方法是实现HTTP管道(根据RFC2616 )。 顺便说一句,我想管道POST。 (另外我不是在谈论多路复用。我在谈论流水线操作,即在接收任何响应之前通过一个连接的许多请求 – 批量处理HTTP请求) 我找不到明确声明它支持流水线操作的第三方库。 但我可以使用例如Apache HTTPCore来构建这样的客户端,或者如果必须的话,我自己构建它。 我遇到的问题是,如果这是一个好主意。 我没有找到任何权威的参考资料,HTTP流水线技术不仅仅是理论模型,而是由HTTP服务器正确实现。 此外,所有支持流水线操作的浏览器都默认关闭此function。 所以,我应该尝试实现这样的客户端,否则我将因服务器的实现(或代理)而遇到很多麻烦。 是否有任何参考资料可以为这些提供指导? 如果不知道什么是效率的替代编程模型? 单独的TCP连接?

同一个ip但不同端口上的两个服务器之间的JSESSIONID冲突

我有一种情况,我在一台服务器上运行两个不同的webapps,使用不同的端口。 它们都运行Java的Jetty servlet容器,因此它们都使用名为JSESSIONID的cookie参数来跟踪会话ID。 这两个webapps正在争夺会话ID。 打开Firefox选项卡,然后转到WebApp1 WebApp1的HTTP响应具有JSESSIONID = 1的set-cookie标头 Firefox现在在WebApp1的所有HTTP请求中都有一个带有JSESSIONID = 1的Cookie标头 打开第二个Firefox选项卡,然后转到WebApp2 对WebApp2的HTTP请求还有一个带有JSESSIONID = 1的Cookie头,但在doGet中,当我调用req.getSession(false); 我得到了。 如果我调用req.getSession(true)我会得到一个新的Session对象,但是WebApp2的HTTP响应有一个带有JSESSIONID = 20的set-cookie头。 现在,WebApp2有一个工作会话,但WebApp1的会话已经消失。 转到WebApp1会给我一个新的会话,吹走WebApp2的会话。 永远继续 所以Sessions在每个网络应用程序之间徘徊。 如果已经定义了JSESSIONID cookie,我真的希望req.getSession(false)返回一个有效的会话。 一种选择是基本上用HashMap和名为WEBAPP1SESSIONID和WEBAPP2SESSIONID的cookie重新实现Session框架,但这很糟糕,这意味着我必须将新的Session内容破解到ActionServlet和其他一些地方。 这一定是其他人遇到的问题。 Jetty的HttpServletRequest.getSession(boolean)是不是很糟糕?

iPad / iPhone上的HTTP字节范围协议客户端行为

我正在测试支持HTTP字节范围请求的HTTP servlet实现(由BalusC共享) 。 我发现不同的HTTP客户端之间存在一些特殊的差异,并且想知道我是否遗漏了任何东西。 我使用了> 2G mp4video文件进行测试,并使用Wireshark捕获数据包。 这大致是发生的事情: 三星Galaxy SII: 文件的HTTP GET请求到来,要求字节范围[0; ] [0; ] 服务器响应,开始流式传输文件 每个后续块在同一HTTP响应的范围内提供。 没有发送新的HTTP请求(除非video被快速转发到某个位置)。 流式代码块非常简单,它读取RandomAccessFile input并通过byte[] buffer写入OutputStream output : while ((read = input.read(buffer)) > 0) { output.write(buffer, 0, read); } iPad 1 文件的HTTP GET请求到来,要求字节范围[0; ] [0; ] 服务器响应,开始流式传输文件 iPad获得一两块,然后单方面决定停止从服务器接受字节,并为文件的下一个块发出单独的GET请求 。 新的范围边界是例如[100, almost the end of the file] 。 video显示正常。 从第2步开始重复循环。左边界始终向文件末尾移动。 我没有调查连接的确切方式。 […]

GET HTTP请求有效负载

我正在设计一个API,我想知道在GET请求上发送JSON有效负载是否合适? 在这个其他问题的HTTP请求方法的有效载荷 ,我们可以根据这个链接找到: 头部 – 没有定义的身体语义。 GET – 没有定义的正文语义。 PUT – 身体支持。 POST – 支持身体。 DELETE – 没有定义的正文语义。 TRACE – 身体不受支持。 选项 – 支持身体但没有语义(可能在将来)。 这是否意味着我不应该发送带有效负载的GET请求? 这样做有风险吗? 就像让一些HTTP客户端库无法发送这样的有效载荷一样? 或者我的Java API代码无法在某些应用程序服务器上移植? 还要别的吗? 我发现ElasticSearch在GET请求上使用了这样的有效负载: $ curl -XGET ‘http://localhost:9200/twitter/tweet/_search?routing=kimchy’ -d ‘{ “query”: { “filtered” : { “query” : { “query_string” : { “query” : “some query string here” } […]

如何正常检测SSL

我有一个可以绑定到ssl或plain http的Web服务。 配置为知道服务器主机和端口的Java客户端。 当客户端连接时,我构建服务器端点,如http:// host:port / service 。 客户端不知道服务器是否正在使用ssl – 服务器始终绑定到单个端口,以便它是安全的或不安全的。 现在,问题是如何让客户端在不引入其他参数的情况下发现它? 我是否可以挑战普通的http请求,然后在特定的exception情况下回到ssl(或反之)? 或者我必须为客户明确引入新的连接参数?

如何使用spring的MockMultipartHttpServletRequest? 得到“没有找到多部分边界”

显然我没有正确使用这个测试夹具。 我的servlet在tomcat中运行得很好,但是当我尝试使用这个mock时,找不到多部分边界。 “请求被拒绝,因为没有找到多部分边界”。 这里有一个答案显示如何使用文本文件来使用它,但该答案明确设置边界字符串并将文件嵌入为test。 我想我不需要手工处理像mockrequest.addFile (…)这样的方法 我没有在这里设置什么,或者我怎么做错了? @org.testng.annotations.Test public void testDoPost() throws Exception { MockMultipartFile file = new MockMultipartFile(“test.zip”, “test.zip”, “application/zip”, MyServletTest.class.getResourceAsStream(“/test.zip”)); MockMultipartHttpServletRequest mockRequest = new MockMultipartHttpServletRequest(); mockRequest.addFile(file); mockRequest.set mockRequest.setMethod(“POST”); mockRequest.setParameter(“variant”, “php”); mockRequest.setParameter(“os”, “mac”); mockRequest.setParameter(“version”, “3.4”); MockHttpServletResponse response = new MockHttpServletResponse(); new MyServletTest().doPost(mockRequest, response); // BOOM ! } 这是例外 Caused by: blablah: the request was […]

如何配置HTTPClient以对SOCKS代理进行身份validation?

我需要针对SOCKS代理设置代理身份validation。 我发现这篇文章给出的说明似乎与常见的HTTP代理一起使用。 httpclient.getHostConfiguration().setProxy(“proxyserver.example.com”, 8080); HttpState state = new HttpState(); state.setProxyCredentials(new AuthScope(“proxyserver.example.com”, 8080), new UsernamePasswordCredentials(“username”, “password”)); httpclient.setState(state); 这也适用于SOCKS代理,还是我必须做一些不同的事情?

使用Apache HttpClient通过Web代理进行Java通信失败

我有一个桌面客户端,它将数据发送到Web服务器,我似乎无法通过代理服务器。 更新 :尝试通过代理进行通信时,我收到407 HTTP错误。 从我的Web服务器下载信息时,一切都很好。 一旦用户配置代理服务器(使用我写的对话框),下载工作正常。 但是使用org.apache.http.client.HttpClient上传数据是行不通的。 在从JDialog收集信息后,我正在使用这样的代码配置代理服务器。 System.setProperty(“http.proxyHost”, proxyHost); System.setProperty(“http.proxyPort”, “” + portNumber); 现在,一旦我们这样做,简单的下载工作正常。 例如,我有从我的Web服务器读取一些xml数据的代码(见下文)。 在客户的网络上,我的catch块中的错误在配置代理设置之前显示,然后一旦设置了正确的代理,一切正常。 /** * Loads a collection of exams from the web site. The URL is determined by * configuration or registration since it is State specific. */ public static int importExamsWS(StringBuilder msg) { try { java.net.URL onlineExams = new […]

将错误消息作为JSON对象发送

我有两个servlet:第一个servlet类似于客户端,并创建一个HttpURLConnection来调用第二个servlet。 我想发送一个特殊的错误,格式化为JSON对象,所以我用这种方式调用sendError方法: response.sendError(code, “{json-object}”) 但是在第一个servlet中,当我使用getResponseMessage方法读取错误时,我只获取标准HTTP消息而不是我的json对象作为字符串。 我怎么能得到我的json字符串?

如何在Maven的settings.xml中为HTTP和HTTPS配置代理服务器?

我在代理服务器后面使用Maven 3.1.1。 相同的代理处理HTTP和HTTPS流量。 我似乎无法告诉maven使用settings.xml来使用这两种协议。 在我看来,只能使用一个活动代理,因为首先使用了定义的活动代理,并忽略后续的“活动”代理定义。 这是我的settings.xml : myhttpproxy true http 192.168.1.2 3128 localhost myhttpsproxy true https 192.168.1.2 3128 localhost 是否可以在maven的settings.xml为HTTP和HTTPS配置代理? 我知道我可以通过将Java系统属性传递给maven调用来解决这个问题,例如: -Dhttps.proxyHost=192.168.1.2 -Dhttps.proxyPort=3128 但肯定这可以在settings.xml吗? 如MNG-2305和MNG-4394等提出的Maven错误表明这个问题已经解决,但我不相信。 或者,是否有一个“代理代理”,我可以在本地运行,我可以指向maven? “代理代理”将相应地路由http / https。 即便如此,我仍然需要在settings.xml为Maven定义两个活动代理定义来指导这两种类型的流量。