Beispiel #1
0
            protected override Stream openStream()
            {
                try
                {
                    String         url  = wire.url + "?serverId=" + TargetId.getServerId() + "&messageid=" + TargetId.getMessageId() + "&streamid=" + TargetId.getStreamId();
                    HttpWebRequest conn = (HttpWebRequest)HttpWebRequest.Create(url);
                    request = wire.createRequestForGetStream(TargetId, this);
                    request.setConnection(conn);

                    conn.Method = "GET";
                    wire.applySession(conn);

                    response           = (HttpWebResponse)conn.GetResponse();
                    ContentType        = response.ContentType;
                    ContentLength      = response.ContentLength;
                    ContentDisposition = response.Headers["Content-Disposition"];

                    responseStream = response.GetResponseStream();
                }
                catch (Exception ex)
                {
                    BException bex = new BException(BExceptionC.IOERROR, "", ex);
                    setAsyncResult(null, bex);
                    wire.removeRequest(request, null, bex);
                }

                throwExceptionIf();

                return(responseStream);
            }
Beispiel #2
0
        protected void getRequestStreamCallback(IAsyncResult asynchronousResult)
        {
            RequestToCancel requestToCancel = (RequestToCancel)asynchronousResult.AsyncState;

            if (log.isDebugEnabled())
            {
                log.debug("getRequestStreamCallback(" + requestToCancel);
            }
            try
            {
                HttpWebRequest conn       = requestToCancel.getConnection();
                Stream         postStream = conn.EndGetRequestStream(asynchronousResult);
                if (requestToCancel.buf != null)
                {
                    if (log.isDebugEnabled())
                    {
                        log.debug("bufferToStream");
                    }
                    bufferToStream(requestToCancel.buf, postStream);
                }
                else if (requestToCancel.stream != null)
                {
                    if (log.isDebugEnabled())
                    {
                        log.debug("copy stream");
                    }
                    requestToCancel.stream.CopyTo(postStream);
                    postStream.Close();
                }
                conn.BeginGetResponse(new AsyncCallback(this.getResponseCallback), requestToCancel);
            }
            catch (Exception e)
            {
                if (log.isDebugEnabled())
                {
                    log.debug("Exception:", e);
                }
                BException bex = null;
                if (_cancelAllRequests)
                {
                    bex = new BException(BExceptionC.CANCELLED, "");
                }
                else
                {
                    bex = new BException(BExceptionC.IOERROR, e.Message, e);
                }
                removeRequest(requestToCancel, null, bex);
            }
            finally
            {
                if (requestToCancel.stream != null)
                {
                    requestToCancel.stream.Close();
                }
            }
            if (log.isDebugEnabled())
            {
                log.debug(")getRequestStreamCallback");
            }
        }
Beispiel #3
0
        void internalSendCancelMessage(RequestToCancel request)
        {
            if (log.isDebugEnabled())
            {
                log.debug("internalSendCancelMessage(" + request);
            }
            try
            {
                HttpWebRequest conn = (HttpWebRequest)HttpWebRequest.Create(request.wire.url + "?messageid=" + request.cancelMessageId + "&cancel=1");
                request.setConnection(conn);

                conn.Method = "GET";
                request.wire.applySession(conn);

                HttpWebResponse response = (HttpWebResponse)conn.GetResponse();
                response.Close();
            }
            catch (Exception e)
            {
                if (log.isDebugEnabled())
                {
                    log.debug("received exception: " + e);
                }
            }

            if (log.isDebugEnabled())
            {
                log.debug(")internalSendCancelMessage");
            }
        }
Beispiel #4
0
        public RequestToCancel createRequestForMessage(BMessage msg, BAsyncResultIF <BMessage> asyncResult)
        {
            ERequestDirection requestDirection = ERequestDirection.FORWARD;
            int timeout = this.timeoutMillisClient;

            // Reverse HTTP request (long-poll)?
            bool isReverse = (msg.header.flags & BMessageHeader.FLAG_RESPONSE) != 0;

            if (isReverse)
            {
                requestDirection = ERequestDirection.REVERSE;
                timeout          = System.Threading.Timeout.Infinite; // timeout controlled by server, 10min by default.
            }

            RequestToCancel r = new RequestToCancel(this,
                                                    requestDirection,
                                                    msg.header.messageId,
                                                    msg.buf,
                                                    null,
                                                    0L,
                                                    0L,
                                                    timeoutMillisClient,
                                                    timeout,
                                                    asyncResult);

            addRequest(r);
            return(r);
        }
Beispiel #5
0
        public RequestToCancel createRequestForGetStream(BTargetId targetId, BAsyncResultIF <BMessage> asyncResult)
        {
            RequestToCancel r = new RequestToCancel(this, ERequestDirection.FORWARD, targetId.getMessageId(), null, null, targetId.getStreamId(), 0L,
                                                    timeoutMillisClient, timeoutMillisClient, asyncResult);

            addRequest(r);
            return(r);
        }
Beispiel #6
0
 void addRequest(RequestToCancel robj)
 {
     if (log.isDebugEnabled())
     {
         log.debug("addRequest(robj=" + robj);
     }
     openRequestsToCancel[robj.getId()] = robj;
     if (log.isDebugEnabled())
     {
         log.debug(")addRequest=" + robj);
     }
 }
Beispiel #7
0
 public bool executeRequest(RequestToCancel r)
 {
     if (log.isDebugEnabled())
     {
         log.debug("executeRequest(" + r);
     }
     r.run();
     if (log.isDebugEnabled())
     {
         log.debug(")executeRequest=true");
     }
     return(true);
 }
Beispiel #8
0
        void internalPutStream(RequestToCancel request)
        {
            long   messageId = request.messageId;
            long   streamId  = request.streamId;
            Stream stream    = request.stream;

            if (log.isDebugEnabled())
            {
                log.debug("internalPutStream(messageId=" + messageId + ", streamId=" + streamId + ", stream=" + stream);
            }

            String contentType        = null;
            long   contentLength      = -1L;
            String contentDisposition = null;

            if (stream is BContentStream)
            {
                BContentStream cstream = (BContentStream)stream;
                contentType        = cstream.ContentType;
                contentLength      = cstream.ContentLength;
                contentDisposition = cstream.ContentDisposition;
            }

            HttpWebRequest conn = (HttpWebRequest)HttpWebRequest.Create(url + "?messageid=" + messageId + "&streamid=" + streamId);

            request.setConnection(conn);

            conn.AllowWriteStreamBuffering = false;
            conn.Method      = "PUT";
            conn.SendChunked = (contentLength == -1L);
            if (contentLength != -1L)
            {
                conn.ContentLength = contentLength;
            }
            conn.ContentType = contentType != null ? contentType : HConstants.DEFAULT_CONTENT_TYPE;
            if (contentDisposition != null)
            {
                conn.Headers.Add("Content-Disposition", contentDisposition);
            }

            applySession(conn);

            conn.BeginGetRequestStream(new AsyncCallback(this.getRequestStreamCallback), request);
            if (log.isDebugEnabled())
            {
                log.debug(")internalPutStream");
            }
        }
Beispiel #9
0
        void removeRequest(RequestToCancel robj, ByteBuffer buf, Exception ex)
        {
            if (log.isDebugEnabled())
            {
                log.debug("removeRequest(" + robj);
            }
            if (robj == null)
            {
                return;
            }
            RequestToCancel rtmp = null;

            openRequestsToCancel.TryRemove(robj.getId(), out rtmp);
            robj.done();
            robj.setAsyncResult(buf, ex);
            if (log.isDebugEnabled())
            {
                log.debug(")removeRequest");
            }
        }
Beispiel #10
0
        protected void getResponseCallback(IAsyncResult asynchronousResult)
        {
            RequestToCancel requestToCancel = (RequestToCancel)asynchronousResult.AsyncState;

            if (log.isDebugEnabled())
            {
                log.debug("getResponseCallback(" + requestToCancel);
            }
            HttpWebResponse response        = null;
            ByteBuffer      returnBuffer    = null;
            Exception       returnException = null;
            HttpWebRequest  conn            = requestToCancel.getConnection();

            try
            {
                response = (HttpWebResponse)conn.EndGetResponse(asynchronousResult);
                if (log.isDebugEnabled())
                {
                    log.debug("status=" + response.StatusCode);
                }
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    requestToCancel.setAsyncResult(null, new BException(BExceptionC.IOERROR, "HTTP Status " + response.StatusCode));
                }
                else
                {
                    saveSession(conn);

                    if (log.isDebugEnabled())
                    {
                        log.debug("bufferFromStream");
                    }

                    Stream responseStream = response.GetResponseStream();
                    returnBuffer = bufferFromStream(responseStream, false);
                }
            }
            catch (WebException e)
            {
                BException bex = null;
                if (_cancelAllRequests)
                {
                    bex = new BException(BExceptionC.CANCELLED, "");
                }
                else
                {
                    if (e.Response != null)
                    {
                        int code = Convert.ToInt32(((HttpWebResponse)e.Response).StatusCode);
                        bex = new BException(code, "HTTP Status " + code);
                    }
                    else
                    {
                        int code = Convert.ToInt32(HttpStatusCode.BadRequest);
                        bex = new BException(code, e.ToString());
                    }
                }
                returnException = bex;
            }
            catch (Exception e)
            {
                if (log.isDebugEnabled())
                {
                    log.debug("Exception", e);
                }
                returnException = new BException(BExceptionC.IOERROR, e.Message, e);
            }
            finally
            {
                if (response != null)
                {
                    response.Close();
                }

                removeRequest(requestToCancel, returnBuffer, returnException);
            }

            if (log.isDebugEnabled())
            {
                log.debug(")getResponseCallback");
            }
        }
Beispiel #11
0
        public void internalSend(RequestToCancel request)
        {
            if (log.isDebugEnabled())
            {
                log.debug("internalSend(" + request);
            }
            ByteBuffer requestDataBuffer = request.buf;

            bool isNegotiate = BNegotiate.isNegotiateMessage(requestDataBuffer);
            bool isJson      = isNegotiate || BMessageHeader.detectProtocol(requestDataBuffer) == BMessageHeader.MAGIC_JSON;

            String destUrl = url;

            // Negotiate?
            if (isNegotiate)
            {
                // Send a GET request and pass the negotate string as parameter

                String negoStr = Encoding.UTF8.GetString(requestDataBuffer.array(), requestDataBuffer.position(), requestDataBuffer.remaining());
                negoStr = System.Uri.EscapeDataString(negoStr);

                destUrl = makeUrl(getServletPathForNegotiationAndAuthentication(),
                                  new String[] { "negotiate", negoStr });
            }

            // Reverse request (long-poll) ?
            else if (request.requestDirection == ERequestDirection.REVERSE)
            {
                destUrl = makeUrl(getServletPathForReverseRequest(), null);
            }

            HttpWebRequest conn = (HttpWebRequest)HttpWebRequest.Create(destUrl);

            request.setConnection(conn);
            conn.Method = isNegotiate ? "GET" : "POST";
            conn.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

            // Content-Type for POST request
            if (!isNegotiate)
            {
                conn.ContentType = isJson ? "application/json" : "application/byps";
            }

            conn.Accept = "application/json, application/byps, text/plain, text/html";

            // BYPS-36: Accept GZIP for both, json and byps
            conn.Headers.Add("Accept-Encoding", "gzip");

            applySession(conn);

            IAsyncResult asyncResult = null;

            if (isNegotiate)
            {
                asyncResult = conn.BeginGetResponse(new AsyncCallback(this.getResponseCallback), request);
            }
            else
            {
                asyncResult = conn.BeginGetRequestStream(new AsyncCallback(this.getRequestStreamCallback), request);
            }

            request.startTimeoutWatcher(conn, asyncResult, request.timeoutMillisRequest);

            if (log.isDebugEnabled())
            {
                log.debug(")internalSend");
            }
        }
Beispiel #12
0
        protected void internalSend(BMessage msg, BAsyncResultIF <BMessage> asyncResult)
        {
            if (log.isDebugEnabled())
            {
                log.debug("send(" + msg + ", asyncResult=" + asyncResult);
            }

            // Convert the BMessage into single RequestToCancel objects.
            // One RequestToCancel is created for msg.buf.
            // For each stream in msg.streams further RequestToCancel objects are created.

            int nbOfRequests = 1 + (msg.streams != null ? msg.streams.Count : 0);
            List <RequestToCancel> requests = new List <RequestToCancel>(nbOfRequests);

            // If the BMessage contains streams, the given asyncResult is wrapped into an
            // outerResult in order to pass only the first exception to the caller.
            BAsyncResultIF <BMessage> outerResult = asyncResult;

            if (nbOfRequests > 1)
            {
                if (log.isDebugEnabled())
                {
                    log.debug("wrap asyncResult");
                }
                outerResult = new AsyncResultAfterAllRequests(this, msg.header.messageId, asyncResult, nbOfRequests);
            }

            // Create RequestToCancel for msg.buf
            RequestToCancel req = createRequestForMessage(msg, outerResult);

            requests.Add(req);

            // Create RequestToCancel objects for each stream.
            if (msg.streams != null)
            {
                foreach (BContentStream stream in msg.streams)
                {
                    req = createRequestForPutStream(stream, outerResult);
                    requests.Add(req);
                }
            }

            // Execute the RequestToCancel objects in the thread pool
            if (log.isDebugEnabled())
            {
                log.debug("put requests into thread pool");
            }
            foreach (RequestToCancel r in requests)
            {
                if (!executeRequest(r))
                {
                    cancelMessage(msg.header.messageId);
                    break;
                }
            }

            if (log.isDebugEnabled())
            {
                log.debug(")send");
            }
        }