HTTP Library

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:

  1. Allow connecting to web servers with bad SSL
  2. Allow to connect(using curl fallback) to newer SSL ciphers/protocols (currently not supported in java 1.7)
  3. Allow to post/patch/put raw JSON/binary (This was till now done through hacky workarounds)
  4. 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"
 
  }