@Test public void testUrl() { HttpRequest httpRequest = new HttpRequest(); httpRequest.set("GET http://jodd.org:173/index.html?light=true"); assertEquals("http://jodd.org:173/index.html?light=true", httpRequest.url()); }
/** Parses input stream and creates new <code>HttpRequest</code> object. */ public static HttpRequest readFrom(InputStream in) { BufferedReader reader; try { reader = new BufferedReader(new InputStreamReader(in, StringPool.ISO_8859_1)); } catch (UnsupportedEncodingException uneex) { return null; } HttpRequest httpRequest = new HttpRequest(); String line; try { line = reader.readLine(); } catch (IOException ioex) { throw new HttpException(ioex); } if (!StringUtil.isBlank(line)) { String[] s = StringUtil.splitc(line, ' '); httpRequest.method(s[0]); httpRequest.path(s[1]); httpRequest.httpVersion(s[2]); httpRequest.readHeaders(reader); httpRequest.readBody(reader); } return httpRequest; }
/** * 用于签名的字符串 * * @param bucket Bucket * @param key 文件key * @param contentMd5 内容的md5值 * @param date 日期 * @param request 请求对象 * @return 用于签名的字符串 */ public static String strToSign( String bucket, String key, String contentMd5, String date, HttpRequest request) { String contentType = request.contentType(); if (StrUtil.isBlank(contentType)) { contentType = "text/plain"; request.contentType(contentType); log.warn("Content-Type header is empty, use default Content-Type: {}", contentType); } return StrUtil.builder() .append(request.method()) .append("\n") .append(StrUtil.nullToEmpty(contentMd5)) .append("\n") .append(contentType) .append("\n") .append(StrUtil.nullToEmpty(date)) .append("\n") .append(canonicalizedUcloudHeaders(request)) // canonicalizedUcloudHeaders尾部带一个换行符 .append(canonicalizedResource(bucket, key)) .toString(); }
/** * 用于签名的标准Ucloud头信息字符串,尾部带换行符 * * @param request Http请求 * @return 用于签名的Ucloud头信息字符串 */ public static String canonicalizedUcloudHeaders(HttpRequest request) { Param param = Param.create(); Map<String, String[]> headers = request.headers(); String[] value; for (Entry<String, String[]> headerEntry : headers.entrySet()) { String name = headerEntry.getKey().toLowerCase(); if (name.startsWith("x-ucloud-")) { value = headerEntry.getValue(); if (value != null && value.length > 0) { param.set(name, value[0]); } } } StringBuilder builder = StrUtil.builder(); for (Entry<String, Object> entry : param.entrySet()) { builder.append(entry.getKey()).append(":").append(entry.getValue()).append("\n"); } return builder.toString(); }
@Test public void testSet() { HttpRequest httpRequest = new HttpRequest(); httpRequest.set("GET http://jodd.org:173/index.html?light=true"); assertEquals("GET", httpRequest.method()); assertEquals("http", httpRequest.protocol()); assertEquals("jodd.org", httpRequest.host()); assertEquals(173, httpRequest.port()); assertEquals("/index.html", httpRequest.path()); assertEquals("true", httpRequest.query().get("light")[0]); httpRequest = new HttpRequest(); httpRequest.set("http://jodd.org:173/index.html?light=true"); assertEquals("GET", httpRequest.method()); assertEquals("http", httpRequest.protocol()); assertEquals("jodd.org", httpRequest.host()); assertEquals(173, httpRequest.port()); assertEquals("/index.html", httpRequest.path()); assertEquals("true", httpRequest.query().get("light")[0]); httpRequest = new HttpRequest(); httpRequest.set("jodd.org:173/index.html?light=true"); assertEquals("GET", httpRequest.method()); assertEquals("http", httpRequest.protocol()); assertEquals("jodd.org", httpRequest.host()); assertEquals(173, httpRequest.port()); assertEquals("/index.html", httpRequest.path()); assertEquals("true", httpRequest.query().get("light")[0]); httpRequest = new HttpRequest(); httpRequest.set("jodd.org/index.html?light=true"); assertEquals("GET", httpRequest.method()); assertEquals("http", httpRequest.protocol()); assertEquals("jodd.org", httpRequest.host()); assertEquals(80, httpRequest.port()); assertEquals("/index.html", httpRequest.path()); assertEquals("true", httpRequest.query().get("light")[0]); httpRequest = new HttpRequest(); httpRequest.set("/index.html?light=true"); assertEquals("GET", httpRequest.method()); assertEquals("http", httpRequest.protocol()); assertEquals("localhost", httpRequest.host()); assertEquals(80, httpRequest.port()); assertEquals("/index.html", httpRequest.path()); assertEquals("true", httpRequest.query().get("light")[0]); httpRequest = new HttpRequest(); httpRequest.set("http://jodd.org"); assertEquals("GET", httpRequest.method()); assertEquals("http", httpRequest.protocol()); assertEquals("jodd.org", httpRequest.host()); assertEquals(80, httpRequest.port()); assertEquals("/", httpRequest.path()); }
@Test public void testQueryParameters() { HttpRequest httpRequest = new HttpRequest(); httpRequest.path(""); assertEquals("/", httpRequest.path()); httpRequest.path("jodd"); assertEquals("/jodd", httpRequest.path()); assertNotNull(httpRequest.query()); assertEquals(0, httpRequest.query().size()); httpRequest.queryString("one=two"); assertEquals("/jodd", httpRequest.path()); Map<String, Object[]> params = httpRequest.query(); assertEquals(1, params.size()); assertEquals("two", params.get("one")[0]); httpRequest.queryString("one"); assertEquals("one", httpRequest.queryString()); params = httpRequest.query(); assertEquals(1, params.size()); assertNull(params.get("one")); httpRequest.queryString("one="); assertEquals("one=", httpRequest.queryString()); params = httpRequest.query(); assertEquals(1, params.size()); assertEquals("", params.get("one")[0]); httpRequest.queryString("one=aaa&two=bbb"); assertEquals("one=aaa&two=bbb", httpRequest.queryString()); params = httpRequest.query(); assertEquals(2, params.size()); assertEquals("aaa", params.get("one")[0]); assertEquals("bbb", params.get("two")[0]); httpRequest.queryString("one=&two=aaa"); assertEquals("one=&two=aaa", httpRequest.queryString()); params = httpRequest.query(); assertEquals(2, params.size()); assertEquals("", params.get("one")[0]); assertEquals("aaa", params.get("two")[0]); httpRequest.clearQueries(); httpRequest.queryString("one=Супер"); assertEquals("one=%D0%A1%D1%83%D0%BF%D0%B5%D1%80", httpRequest.queryString()); params = httpRequest.query(); assertEquals(1, params.size()); assertEquals("Супер", params.get("one")[0]); httpRequest.queryString("one=Sуp"); assertEquals("one=S%D1%83p", httpRequest.queryString()); httpRequest.queryString("one=1&one=2"); assertEquals("one=1&one=2", httpRequest.queryString()); params = httpRequest.query(); assertEquals(1, params.size()); assertEquals("1", params.get("one")[0]); assertEquals("2", params.get("one")[1]); httpRequest.query("one", Integer.valueOf(3)); assertEquals("one=1&one=2&one=3", httpRequest.queryString()); }
@Test public void testFileUpload() throws IOException { HttpRequest request = HttpRequest.get("http://jodd.org/?id=173"); request.header("User-Agent", "Scaly").form("one", "funny"); File tempFile = FileUtil.createTempFile(); tempFile.deleteOnExit(); FileUtil.writeString(tempFile, "qwerty"); request.form("two", tempFile); byte[] bytes = request.toByteArray(); // read HttpRequest request2 = HttpRequest.readFrom(new ByteArrayInputStream(bytes)); Map<String, Object[]> httpParams2 = request2.form(); assertEquals(request.method(), request2.method()); assertEquals(request.path(), request2.path()); assertEquals(request.queryString(), request2.queryString()); assertEquals(request.header("User-Agent"), request2.header("User-Agent")); assertEquals(request.header("Content-Type"), request2.header("content-type")); assertEquals(request.header("Content-Length"), request2.header("content-length")); Map params1 = request.form(); Map params2 = request2.form(); assertEquals(params1.size(), params2.size()); assertEquals(params2.get("one"), params2.get("one")); FileUpload fu = (FileUpload) httpParams2.get("two")[0]; assertEquals(6, fu.getSize()); String str = new String(fu.getFileContent()); assertEquals("qwerty", str); tempFile.delete(); }
@Test public void testNegativeContentLength() { HttpRequest request = HttpRequest.get("http://jodd.org/?id=173"); request.contentLength(-123); byte[] bytes = request.toByteArray(); try { HttpRequest request2 = HttpRequest.readFrom(new ByteArrayInputStream(bytes)); assertEquals("", request2.body()); } catch (Exception ex) { Assert.fail(ex.toString()); } // the same test but with missing content length request = HttpRequest.get("http://jodd.org/?id=173"); bytes = request.toByteArray(); try { HttpRequest request2 = HttpRequest.readFrom(new ByteArrayInputStream(bytes)); assertEquals("", request2.body()); } catch (Exception ex) { Assert.fail(ex.toString()); } }
@Test public void testInOutForm() { HttpRequest request = HttpRequest.get("http://jodd.org/?id=173"); request.header("User-Agent", "Scaly"); request.form("one", "funny"); byte[] bytes = request.toByteArray(); // read HttpRequest request2 = HttpRequest.readFrom(new ByteArrayInputStream(bytes)); assertEquals(request.method(), request2.method()); assertEquals(request.path(), request2.path()); assertEquals(request.queryString(), request2.queryString()); assertEquals(request.header("User-Agent"), request2.header("User-Agent")); assertEquals(request.header("Content-Type"), request2.header("content-type")); assertEquals(request.header("Content-Length"), request2.header("content-length")); Map params1 = request.form(); Map params2 = request2.form(); assertEquals(params1.size(), params2.size()); assertEquals(params2.get("one"), params2.get("one")); }