static void read_socket(int fd, void (*post_cb) (post_content_t*)) { char buf[1024] = {}; http_parser_helper_t* helper = http_parser_helper_init(); while(true){ memset(&buf, 0, sizeof(char) * 1024); ssize_t len = read(fd, &buf, sizeof(char) * 1024); if(len < 0){ perror("read error"); exit(EXIT_FAILURE); } else{ http_parser_execute(&(helper->parser), &(helper->settings), buf, len); if(helper->is_done){ break; } } } char* body = stringlist_concat(helper->body); post_content_t* post_content = body_parser_parse(body); post_cb(post_content); post_content_free(post_content); stringlist_concat_free(body); http_parser_helper_free(helper); }
/* Send an HTTP request. On success returns an estream object at R_FP. HOSTPORTSTR is only used for diagnostics. If HTTPHOST is not NULL it will be used as HTTP "Host" header. If POST_CB is not NULL a post request is used and that callback is called to allow writing the post data. */ static gpg_error_t send_request (ctrl_t ctrl, const char *request, const char *hostportstr, const char *httphost, unsigned int httpflags, gpg_error_t (*post_cb)(void *, http_t), void *post_cb_value, estream_t *r_fp) { gpg_error_t err; http_session_t session = NULL; http_t http = NULL; int redirects_left = MAX_REDIRECTS; estream_t fp = NULL; char *request_buffer = NULL; *r_fp = NULL; err = http_session_new (&session, NULL); if (err) goto leave; http_session_set_log_cb (session, cert_log_cb); once_more: err = http_open (&http, post_cb? HTTP_REQ_POST : HTTP_REQ_GET, request, httphost, /* fixme: AUTH */ NULL, (httpflags | (opt.honor_http_proxy? HTTP_FLAG_TRY_PROXY:0)), ctrl->http_proxy, session, NULL, /*FIXME curl->srvtag*/NULL); if (!err) { fp = http_get_write_ptr (http); /* Avoid caches to get the most recent copy of the key. We set both the Pragma and Cache-Control versions of the header, so we're good with both HTTP 1.0 and 1.1. */ es_fputs ("Pragma: no-cache\r\n" "Cache-Control: no-cache\r\n", fp); if (post_cb) err = post_cb (post_cb_value, http); if (!err) { http_start_data (http); if (es_ferror (fp)) err = gpg_error_from_syserror (); } } if (err) { /* Fixme: After a redirection we show the old host name. */ log_error (_("error connecting to '%s': %s\n"), hostportstr, gpg_strerror (err)); goto leave; } /* Wait for the response. */ dirmngr_tick (ctrl); err = http_wait_response (http); if (err) { log_error (_("error reading HTTP response for '%s': %s\n"), hostportstr, gpg_strerror (err)); goto leave; } if (http_get_tls_info (http, NULL)) { /* Update the httpflags so that a redirect won't fallback to an unencrypted connection. */ httpflags |= HTTP_FLAG_FORCE_TLS; } switch (http_get_status_code (http)) { case 200: err = 0; break; /* Success. */ case 301: case 302: case 307: { const char *s = http_get_header (http, "Location"); log_info (_("URL '%s' redirected to '%s' (%u)\n"), request, s?s:"[none]", http_get_status_code (http)); if (s && *s && redirects_left-- ) { xfree (request_buffer); request_buffer = xtrystrdup (s); if (request_buffer) { request = request_buffer; http_close (http, 0); http = NULL; goto once_more; } err = gpg_error_from_syserror (); } else err = gpg_error (GPG_ERR_NO_DATA); log_error (_("too many redirections\n")); } goto leave; default: log_error (_("error accessing '%s': http status %u\n"), request, http_get_status_code (http)); err = gpg_error (GPG_ERR_NO_DATA); goto leave; } /* FIXME: We should register a permanent redirection and whether a host has ever used TLS so that future calls will always use TLS. */ fp = http_get_read_ptr (http); if (!fp) { err = gpg_error (GPG_ERR_BUG); goto leave; } /* Return the read stream and close the HTTP context. */ *r_fp = fp; http_close (http, 1); http = NULL; leave: http_close (http, 0); http_session_release (session); xfree (request_buffer); return err; }
bool iupPlot::Render(cdCanvas* canvas) { if (!mRedraw) return true; // Shift the drawing area to the plot viewport cdCanvasOrigin(canvas, mViewport.mX, mViewport.mY); // There are no additional transformations set in the CD canvas, // all transformations are done here. cdCanvasClip(canvas, CD_CLIPAREA); // Draw the background, axis and grid restricted only by the viewport cdCanvasClipArea(canvas, 0, mViewport.mWidth - 1, 0, mViewport.mHeight - 1); // draw entire plot viewport DrawBackground(canvas); if (!mDataSetListCount) return true; cdCanvasNativeFont(canvas, IupGetAttribute(ih, "FONT")); ConfigureAxis(); if (!CalculateAxisRange()) return false; if (!CheckRange(mAxisX)) return false; if (!CheckRange(mAxisY)) return false; CalculateTitlePos(); // Must be before calculate margins CalculateTickSize(canvas, mAxisX.mTick); CalculateTickSize(canvas, mAxisY.mTick); CalculateMargins(canvas); iupPlotRect theDatasetArea; theDatasetArea.mX = mBack.mMargin.mLeft; theDatasetArea.mY = mBack.mMargin.mBottom; theDatasetArea.mWidth = mViewport.mWidth - mBack.mMargin.mLeft - mBack.mMargin.mRight; theDatasetArea.mHeight = mViewport.mHeight - mBack.mMargin.mTop - mBack.mMargin.mBottom; if (!CalculateTickSpacing(theDatasetArea, canvas)) return false; if (!CalculateXTransformation(theDatasetArea)) return false; if (!CalculateYTransformation(theDatasetArea)) return false; IFnC pre_cb = (IFnC)IupGetCallback(ih, "PREDRAW_CB"); if (pre_cb) pre_cb(ih, canvas); if (mBack.GetImage()) DrawBackgroundImage(canvas); if (!mGrid.DrawX(mAxisX.mTickIter, mAxisX.mTrafo, theDatasetArea, canvas)) return false; if (mGrid.mShowX) mGridMinor.DrawX(mAxisX.mTickIter, mAxisX.mTrafo, theDatasetArea, canvas); if (!mGrid.DrawY(mAxisY.mTickIter, mAxisY.mTrafo, theDatasetArea, canvas)) return false; if (mGrid.mShowY) mGridMinor.DrawY(mAxisY.mTickIter, mAxisY.mTrafo, theDatasetArea, canvas); if (!mAxisX.DrawX(theDatasetArea, canvas, mAxisY)) return false; if (!mAxisY.DrawY(theDatasetArea, canvas, mAxisX)) return false; if (mBox.mShow) mBox.Draw(theDatasetArea, canvas); // draw the datasets, legend, crosshair and selection restricted to the dataset area cdCanvasClipArea(canvas, theDatasetArea.mX, theDatasetArea.mX + theDatasetArea.mWidth - 1, theDatasetArea.mY, theDatasetArea.mY + theDatasetArea.mHeight - 1); IFniiddi drawsample_cb = (IFniiddi)IupGetCallback(ih, "DRAWSAMPLE_CB"); for (int ds = 0; ds < mDataSetListCount; ds++) { iupPlotDataSet* dataset = mDataSetList[ds]; if (drawsample_cb) { iupPlotSampleNotify inNotify = { ih, ds, drawsample_cb }; dataset->DrawData(mAxisX.mTrafo, mAxisY.mTrafo, canvas, &inNotify); } else dataset->DrawData(mAxisX.mTrafo, mAxisY.mTrafo, canvas, NULL); } if (mCrossHairH) DrawCrossHairH(theDatasetArea, canvas); else if (mCrossHairV) DrawCrossHairV(theDatasetArea, canvas); if (mShowSelectionBand) { if (mSelectionBand.mX < theDatasetArea.mX) { mSelectionBand.mWidth = mSelectionBand.mX + mSelectionBand.mWidth - theDatasetArea.mX; mSelectionBand.mX = theDatasetArea.mX; } if (mSelectionBand.mY < theDatasetArea.mY) { mSelectionBand.mHeight = mSelectionBand.mY + mSelectionBand.mHeight - theDatasetArea.mY; mSelectionBand.mY = theDatasetArea.mY; } if (mSelectionBand.mX + mSelectionBand.mWidth > theDatasetArea.mX + theDatasetArea.mWidth) mSelectionBand.mWidth = theDatasetArea.mX + theDatasetArea.mWidth - mSelectionBand.mX; if (mSelectionBand.mY + mSelectionBand.mHeight > theDatasetArea.mY + theDatasetArea.mHeight) mSelectionBand.mHeight = theDatasetArea.mY + theDatasetArea.mHeight - mSelectionBand.mY; mBox.Draw(mSelectionBand, canvas); } IFnC post_cb = (IFnC)IupGetCallback(ih, "POSTDRAW_CB"); if (post_cb) post_cb(ih, canvas); if (!DrawLegend(theDatasetArea, canvas, mLegend.mPos)) return false; // Draw title restricted only by the viewport cdCanvasClipArea(canvas, 0, mViewport.mWidth - 1, 0, mViewport.mHeight - 1); DrawTitle(canvas); if (!IupGetInt(ih, "ACTIVE")) DrawInactive(canvas); mRedraw = false; return true; }
/* Send an HTTP request. On success returns an estream object at R_FP. HOSTPORTSTR is only used for diagnostics. If POST_CB is not NULL a post request is used and that callback is called to allow writing the post data. */ static gpg_error_t send_request (ctrl_t ctrl, const char *request, const char *hostportstr, gpg_error_t (*post_cb)(void *, http_t), void *post_cb_value, estream_t *r_fp) { gpg_error_t err; http_t http = NULL; int redirects_left = MAX_REDIRECTS; estream_t fp = NULL; char *request_buffer = NULL; *r_fp = NULL; once_more: err = http_open (&http, post_cb? HTTP_REQ_POST : HTTP_REQ_GET, request, /* fixme: AUTH */ NULL, 0, /* fixme: proxy*/ NULL, NULL, NULL, /*FIXME curl->srvtag*/NULL); if (!err) { fp = http_get_write_ptr (http); /* Avoid caches to get the most recent copy of the key. We set both the Pragma and Cache-Control versions of the header, so we're good with both HTTP 1.0 and 1.1. */ es_fputs ("Pragma: no-cache\r\n" "Cache-Control: no-cache\r\n", fp); if (post_cb) err = post_cb (post_cb_value, http); if (!err) { http_start_data (http); if (es_ferror (fp)) err = gpg_error_from_syserror (); } } if (err) { /* Fixme: After a redirection we show the old host name. */ log_error (_("error connecting to '%s': %s\n"), hostportstr, gpg_strerror (err)); goto leave; } /* Wait for the response. */ dirmngr_tick (ctrl); err = http_wait_response (http); if (err) { log_error (_("error reading HTTP response for '%s': %s\n"), hostportstr, gpg_strerror (err)); goto leave; } switch (http_get_status_code (http)) { case 200: err = 0; break; /* Success. */ case 301: case 302: { const char *s = http_get_header (http, "Location"); log_info (_("URL '%s' redirected to '%s' (%u)\n"), request, s?s:"[none]", http_get_status_code (http)); if (s && *s && redirects_left-- ) { xfree (request_buffer); request_buffer = xtrystrdup (s); if (request_buffer) { request = request_buffer; http_close (http, 0); http = NULL; goto once_more; } err = gpg_error_from_syserror (); } else err = gpg_error (GPG_ERR_NO_DATA); log_error (_("too many redirections\n")); } goto leave; default: log_error (_("error accessing '%s': http status %u\n"), request, http_get_status_code (http)); err = gpg_error (GPG_ERR_NO_DATA); goto leave; } fp = http_get_read_ptr (http); if (!fp) { err = gpg_error (GPG_ERR_BUG); goto leave; } /* Return the read stream and close the HTTP context. */ *r_fp = fp; http_close (http, 1); http = NULL; leave: http_close (http, 0); xfree (request_buffer); return err; }