Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Check null for HttpWebResponse

Tags:

rest

c#

http

wcf

I am making HTTP post request to REST service, When I get the HttpWebResponse back, I am doing below check. Should I also check responseStream != null when I am doing webresponse != null

HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;
if (webResponse != null)
{
    var responseStream = webResponse.GetResponseStream();
    int responseCode = (int)webResponse.StatusCode;
    if (responseStream != null && responseCode == (int)HttpStatusCode.Created)
    {
        cmsStoreWebResponse = ((new  StreamReader(responseStream)).ReadToEnd());`
    }
    else
    {
        this.LogError(string.Format("{0}\n Endpoint: {1}\n {2} {3} {4}", ErrorCodes.IWS_CMSRetrieve_ERROR_001, oagEndpointUrl, ErrorCodes.IWS_CMSStore_ERROR_SERVICE_DOWN, responseStream, responseCode));
        serviceData.Fatal = true;
        serviceData.ErrorCode = ErrorCodes.IWS_EFORMSFORMSETS_001;
        serviceData.ErrorDetails = string.Format("\nEndpoint: {0}\n {1}", oagEndpointUrl, ErrorCodes.RESPONSE_STREAM_NULL);
        throw new FaultException<ServiceExceptionData>(serviceData, new FaultReason(string.Format("\nEndpoint: {0}\n {1}", oagEndpointUrl, ErrorCodes.RESPONSE_STREAM_NULL)));
    }
}
else
{
    this.LogError(string.Format("{0}\n Endpoint: {1}\n {2}",  ErrorCodes.IWS_CMSRetrieve_ERROR_001, oagEndpointUrl, ErrorCodes.IWS_CMSStore_ERROR_SERVICE_DOWN));
    serviceData.Fatal = true;
    serviceData.ErrorCode = ErrorCodes.IWS_EFORMSFORMSETS_001;
    serviceData.ErrorDetails = string.Format("\nEndpoint: {0}\n {1}", oagEndpointUrl, ErrorCodes.RESPONSE_STREAM_NULL);
    throw new FaultException<ServiceExceptionData>(serviceData, new FaultReason(string.Format("\nEndpoint: {0}\n {1}", oagEndpointUrl, ErrorCodes.RESPONSE_STREAM_NULL)));
}
like image 676
user3456546 Avatar asked Apr 07 '14 19:04

user3456546


2 Answers

No built-in type derived from WebResponse, in particular HttpWebResponse, can return null. This superstitious belief has misled many developers. Don't check for null. Such code is dead code.

What would null even mean compared to returning an empty stream?! This does not make sense.

Also, GetResponse() cannot return null. Again, what is that supposed to mean?! The HTTP protocol does not support the notion of a "null response". If that ever happens due to a library bug it's not possible to handle that situation anyway. Any such check does not help.

It is possible to create classes derived from WebResponse that return an insane values such as null. No built-in class does that and it should be considered a bug to return null. Classes derived from WebResponse are very rare. I have never seen one.

Here's a good code pattern to use:

var request = WebRequest.Create("http://example.org/");

using (var response = request.GetResponse())
using (var responseStream = response.GetResponseStream())
using (var responseReader = new StreamReader(responseStream))
{
    var contents = responseReader.ReadToEnd();
}

It demonstrates how to succinctly and safely read the contents of an HTTP URL using HttpWebRequest.

like image 161
usr Avatar answered Sep 24 '22 19:09

usr


HttpWebResponse.GetResponseStream() can return null, so yes, you should check whether it is null or not.

You should also check whether HttpWebResponse.GetResponseStream() == Stream.Null

So, something like this:

var webResponseStream = webResponse.GetResponseStream();

if (webResponseStream != null && webResponseStream != Stream.Null)
{
    //do stuff.
}

In case you're wondering, webResponseStream != null checks for whether a reference to a Stream has been assigned to the variable webResponseStream, whereas webResponseStream != Stream.Null checks whether or not the Stream instance assigned to webResponseStream contains any backing data.

like image 37
Brian Driscoll Avatar answered Sep 20 '22 19:09

Brian Driscoll