====== HTTP Library ======
--- //[[avinash.dsilva@errigal.com|Avinash D'Silva]] 2019/04/12 09:25//
The JavaHttpClient is a wrapper library developed as a part of R&D (in April 2019 IDMS-3748) so as to provide a HTTP client for our aging SnmpManager as it wasn't practical to upgrade the existing libraries.
The JavaHttpClient was created to deal with the following primary challenges:
- Allow connecting to web servers with bad SSL
- Allow to connect(using curl fallback) to newer SSL ciphers/protocols (currently not supported in java 1.7)
- Allow to post/patch/put raw JSON/binary (This was till now done through hacky workarounds)
- Support reading and writing raw header information.
Example usage:
import com.errigal.snmpmanager.autodiscovery.http.*
String url = ""
String body ="""{"hi":"bye"}"""
CustomHttpResponse chr = null
CustomHttpClient client = new JavaHttpClient()
url = 'https://demo7260167.mockable.io/getTest'
log.info "url: "+url
chr = client.get(url,null)
log.info chr.dump()
assert chr.success == true
url = 'https://demo7260167.mockable.io/optionsTest'
log.info "url: "+url
chr = client.options(url,null)
log.info chr.dump()
assert chr.success == true
//head not testable
url = 'https://demo7260167.mockable.io/deleteTest'
log.info "url: "+url
chr = client.delete(url,null)
log.info chr.dump()
assert chr.success == true
url = 'https://demo7260167.mockable.io/postTest'
log.info "url: "+url
chr = client.post(url,body.getBytes(),'text/html',null)
log.info chr.dump()
assert chr.success == true
url = 'https://demo7260167.mockable.io/putTest'
log.info "url: "+url
chr = client.put(url,body.getBytes(),'text/html',null)
log.info chr.dump()
assert chr.success == true
url = 'https://demo7260167.mockable.io/patchTest'
log.info "url: "+url
chr = client.patch(url,body.getBytes(),'text/html',null)
log.info chr.dump()
assert chr.success == true
JavaHttpClient falls to CurlHttpClient if it is unable to process due to SSL specific exceptions.
CustomHttpResponse has two convenience methods :
There are some gotchas to remember due to the way RFC allows duplicate HTTP headers keys,
The working is defined in the tests below
1. getCookie
void testResponse(){
CustomHttpResponse customHttpResponse = new CustomHttpResponse()
customHttpResponse.getHeaders().put("k0","v0")
customHttpResponse.getHeaders().put("sEt-CoOkIe","v1=x")
customHttpResponse.getHeaders().put("SET-COOKIE","v2=y")
String cookie = customHttpResponse.getCookie("v2")
assert cookie == "v2=y"
}
2. getHeader
void testGetHeader(){
CustomHttpResponse customHttpResponse = new CustomHttpResponse()
customHttpResponse.getHeaders().put("k0","v0")
customHttpResponse.getHeaders().put("k1","v1")
customHttpResponse.getHeaders().put("k1","v2")
assert customHttpResponse.getHeader("k0") == "v0"
assert customHttpResponse.getHeader("k1") == "v1"
}