{"id":20565,"date":"2014-01-13T10:00:30","date_gmt":"2014-01-13T08:00:30","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/?p=20565"},"modified":"2014-01-14T00:58:51","modified_gmt":"2014-01-13T22:58:51","slug":"making-http-content-compression-work-in-netty-4","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html","title":{"rendered":"Making HTTP content compression work in netty 4"},"content":{"rendered":"<p><a href=\"http:\/\/netty.io\/\" target=\"_blank\">Netty<\/a> is really a great framework providing all the things needed to build a high performance HTTP server. The nice thing is, that nearly everything comes out of the box and has just to be put together in the right way. And <b>content compression<\/b> (gzip or deflate) is no exception. However, when it comes to compressing static content I stumbled quite a few times before everything worked as expected:<\/p>\n<p>Based on the <a href=\"https:\/\/github.com\/netty\/netty\/tree\/master\/example\/src\/main\/java\/io\/netty\/example\/http\/file\" target=\"_blank\">http\/file<\/a> example provided by netty I used to following approach to serve static files (same as used in netty 3.6.6):<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<\/p>\n<pre class=\"brush:java\"> RandomAccessFile raf = new RandomAccessFile(file, \"r\");\r\nHttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK); \r\nctx.write(response);\r\n\r\nif (useSendFile) {\r\n    ctx.write(new DefaultFileRegion(raf.getChannel(), 0, fileLength));\r\n} else {\r\n    ctx.write(new ChunkedFile(raf, 0, fileLength, 8192));\r\n}<\/pre>\n<p>However, as soon as I added a <b>HttpContentCompressor<\/b> to the pipeline, Firefox failed with a message like &#8220;invalid content encoding&#8221;.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>As it turns out, the <a href=\"https:\/\/github.com\/netty\/netty\/blob\/master\/codec-http\/src\/main\/java\/io\/netty\/handler\/codec\/http\/HttpContentCompressor.java\" target=\"_blank\">HttpContentCompressor<\/a> expects <a href=\"https:\/\/github.com\/netty\/netty\/blob\/master\/codec-http\/src\/main\/java\/io\/netty\/handler\/codec\/http\/HttpContent.java\" target=\"_blank\">HttpContent<\/a> objects as input chunks to be compressed. However, the <a href=\"https:\/\/github.com\/netty\/netty\/blob\/master\/handler\/src\/main\/java\/io\/netty\/handler\/stream\/ChunkedWriteHandler.java\" target=\"_blank\">ChunkedWriteHandler<\/a> directly sent <b>ByteBufs<\/b> to the downstream. Also sending a <b>FileRegion<\/b> (useSendFile=true) left the content compressor unimpressed.<\/p>\n<p>In order to overcome this problem I create a class named <a href=\"https:\/\/github.com\/scireum\/sirius\/blob\/develop\/web\/src\/sirius\/web\/http\/ChunkedInputAdapter.java\" target=\"_blank\">ChunkedInputAdapter<\/a> which takes a <b>ChunkedInput&lt;ByteBuf&gt;<\/b> and represents <b>ChunkedInput&lt;HttpContent&gt;<\/b>. However, two things still weren&#8217;t satisfying: First, <b>FileRegions<\/b> and the <i>zero-copy capbility<\/i> still couldn&#8217;t be used and second, already compressed files like <b>JPEGs<\/b> will be compressed again. Therefore I sublassed <b>HttpContentCompressor<\/b> with a class called <a href=\"https:\/\/github.com\/scireum\/sirius\/blob\/develop\/web\/src\/sirius\/web\/http\/SmartHttpContentCompressor.java\" target=\"_blank\">SmartContentCompressor<\/a>. This class check if either a header &#8220;<i>Content-Encoding: Identity<\/i>&#8221; or a <i>specific content-type<\/i> or a <i>content-length less than 1 kB<\/i> is present. In there cases the content compression is bypassed.<\/p>\n<p>Using this combination permits to use both, content compression when it is useful and the zero copy capability if the file is already compressed.<\/p>\n<p>All the sources mentioned above are open sourced under the MIT license and part of the <a href=\"http:\/\/sirius-lib.net\/\" target=\"_blank\">S<\/a><a href=\"https:\/\/www.blogger.com\/null\" target=\"_blank\">IRIUS framework<\/a>.<br \/>\n&nbsp;<\/p>\n<div style=\"border: 1px solid #D8D8D8; background: #FAFAFA; width: 100%; padding-left: 5px;\"><b><i>Reference: <\/i><\/b><a href=\"http:\/\/andreas.haufler.info\/2014\/01\/making-http-content-compression-work-in.html\">Making HTTP content compression work in netty 4<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/jcg\">JCG partner<\/a> Andreas Haufler at the <a href=\"http:\/\/andreas.haufler.info\/\">Andy&#8217;s Software Engineering Corner<\/a> blog.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Netty is really a great framework providing all the things needed to build a high performance HTTP server. The nice thing is, that nearly everything comes out of the box and has just to be put together in the right way. And content compression (gzip or deflate) is no exception. However, when it comes to &hellip;<\/p>\n","protected":false},"author":146,"featured_media":158,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[505],"class_list":["post-20565","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-jboss-netty"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Making HTTP content compression work in netty 4<\/title>\n<meta name=\"description\" content=\"Netty is really a great framework providing all the things needed to build a high performance HTTP server. The nice thing is, that nearly everything comes\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Making HTTP content compression work in netty 4\" \/>\n<meta property=\"og:description\" content=\"Netty is really a great framework providing all the things needed to build a high performance HTTP server. The nice thing is, that nearly everything comes\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2014-01-13T08:00:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2014-01-13T22:58:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/jboss-netty-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Andreas Haufler\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andreas Haufler\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/01\\\/making-http-content-compression-work-in-netty-4.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/01\\\/making-http-content-compression-work-in-netty-4.html\"},\"author\":{\"name\":\"Andreas Haufler\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/877cbef97bf88bc8c81fafabfe36ce9d\"},\"headline\":\"Making HTTP content compression work in netty 4\",\"datePublished\":\"2014-01-13T08:00:30+00:00\",\"dateModified\":\"2014-01-13T22:58:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/01\\\/making-http-content-compression-work-in-netty-4.html\"},\"wordCount\":315,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/01\\\/making-http-content-compression-work-in-netty-4.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/jboss-netty-logo.jpg\",\"keywords\":[\"JBoss Netty\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/01\\\/making-http-content-compression-work-in-netty-4.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/01\\\/making-http-content-compression-work-in-netty-4.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/01\\\/making-http-content-compression-work-in-netty-4.html\",\"name\":\"Making HTTP content compression work in netty 4\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/01\\\/making-http-content-compression-work-in-netty-4.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/01\\\/making-http-content-compression-work-in-netty-4.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/jboss-netty-logo.jpg\",\"datePublished\":\"2014-01-13T08:00:30+00:00\",\"dateModified\":\"2014-01-13T22:58:51+00:00\",\"description\":\"Netty is really a great framework providing all the things needed to build a high performance HTTP server. The nice thing is, that nearly everything comes\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/01\\\/making-http-content-compression-work-in-netty-4.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/01\\\/making-http-content-compression-work-in-netty-4.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/01\\\/making-http-content-compression-work-in-netty-4.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/jboss-netty-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/jboss-netty-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/01\\\/making-http-content-compression-work-in-netty-4.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Making HTTP content compression work in netty 4\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/877cbef97bf88bc8c81fafabfe36ce9d\",\"name\":\"Andreas Haufler\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9b91a769938d1bf33fb448fa0e6b7334e2cc122592b89bbe8077a8899ca237a1?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9b91a769938d1bf33fb448fa0e6b7334e2cc122592b89bbe8077a8899ca237a1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9b91a769938d1bf33fb448fa0e6b7334e2cc122592b89bbe8077a8899ca237a1?s=96&d=mm&r=g\",\"caption\":\"Andreas Haufler\"},\"sameAs\":[\"http:\\\/\\\/andreas.haufler.info\\\/\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Andreas-Haufler\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Making HTTP content compression work in netty 4","description":"Netty is really a great framework providing all the things needed to build a high performance HTTP server. The nice thing is, that nearly everything comes","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html","og_locale":"en_US","og_type":"article","og_title":"Making HTTP content compression work in netty 4","og_description":"Netty is really a great framework providing all the things needed to build a high performance HTTP server. The nice thing is, that nearly everything comes","og_url":"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2014-01-13T08:00:30+00:00","article_modified_time":"2014-01-13T22:58:51+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/jboss-netty-logo.jpg","type":"image\/jpeg"}],"author":"Andreas Haufler","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Andreas Haufler","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html"},"author":{"name":"Andreas Haufler","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/877cbef97bf88bc8c81fafabfe36ce9d"},"headline":"Making HTTP content compression work in netty 4","datePublished":"2014-01-13T08:00:30+00:00","dateModified":"2014-01-13T22:58:51+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html"},"wordCount":315,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/jboss-netty-logo.jpg","keywords":["JBoss Netty"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html","url":"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html","name":"Making HTTP content compression work in netty 4","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/jboss-netty-logo.jpg","datePublished":"2014-01-13T08:00:30+00:00","dateModified":"2014-01-13T22:58:51+00:00","description":"Netty is really a great framework providing all the things needed to build a high performance HTTP server. The nice thing is, that nearly everything comes","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/jboss-netty-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/jboss-netty-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2014\/01\/making-http-content-compression-work-in-netty-4.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Making HTTP content compression work in netty 4"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/877cbef97bf88bc8c81fafabfe36ce9d","name":"Andreas Haufler","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/9b91a769938d1bf33fb448fa0e6b7334e2cc122592b89bbe8077a8899ca237a1?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/9b91a769938d1bf33fb448fa0e6b7334e2cc122592b89bbe8077a8899ca237a1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9b91a769938d1bf33fb448fa0e6b7334e2cc122592b89bbe8077a8899ca237a1?s=96&d=mm&r=g","caption":"Andreas Haufler"},"sameAs":["http:\/\/andreas.haufler.info\/"],"url":"https:\/\/www.javacodegeeks.com\/author\/Andreas-Haufler"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/20565","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/146"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=20565"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/20565\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/158"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=20565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=20565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=20565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}