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); }
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"); } }
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"); } }
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); }
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); }
void addRequest(RequestToCancel robj) { if (log.isDebugEnabled()) { log.debug("addRequest(robj=" + robj); } openRequestsToCancel[robj.getId()] = robj; if (log.isDebugEnabled()) { log.debug(")addRequest=" + robj); } }
public bool executeRequest(RequestToCancel r) { if (log.isDebugEnabled()) { log.debug("executeRequest(" + r); } r.run(); if (log.isDebugEnabled()) { log.debug(")executeRequest=true"); } return(true); }
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"); } }
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"); } }
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"); } }
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"); } }
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"); } }