Project

General

Profile

Actions

Bug #994

closed

WStreamResource pushes Content-Disposition in resource contents...

Added by Łukasz Matuszewski over 12 years ago. Updated over 12 years ago.

Status:
Closed
Priority:
Normal
Assignee:
Target version:
Start date:
09/21/2011
Due date:
% Done:

0%

Estimated time:

Description

I have custom WStreamResource which looks like this:

      class ParamsResource : public WStreamResource
      {
        public:
          ParamsResource(DatabaseModule *dm, long long utwId, WObject *parent = 0);

          virtual ~ParamsResource();

          virtual void handleRequest(const Wt::Http::Request& request,
                             Wt::Http::Response& response);

        protected:
          DatabaseModule              *m_dm;
          long long                    m_utwId;
          stringstream                 m_ss_response;
      };


      ParamsResource::ParamsResource(DatabaseModule *dm,
          long long utwId, WObject *parent) :
          WStreamResource(parent), m_dm(dm), m_utwId(utwId)
      {
        this->setBufferSize(100 * 1024);
        try
        {
          Transaction tr = this->m_dm->createTransaction(amRead,
              ilReadCommitted, lrWait);
          tr->Start();
          ostringstream sql;
          sql << "select GAT_GATUNEK || '_' || ART_NAZWA_ARTYSTY || '_' "
                 " || ALB_NAZWA_ALBUMU || '_' || UTW_TYTUL_UTWORU "
                 " from MIR_NAZARTNAZALBITP "
                 " where UTW_ID = "
                 << this->m_utwId;
          string sqlstmt = sql.str();

          Statement stmt = this->m_dm->createStatement(&tr);
          stmt->Prepare(sqlstmt);
          stmt->Execute();

          if (stmt->Fetch())
          {
            bool isIE = WApplication::instance()->environment().userAgent().find("MSIE") != string::npos;
            bool isChrome = WApplication::instance()->environment().userAgent().find("Chrome") != string::npos;
            bool isLynx = WApplication::instance()->environment().userAgent().find("Lynx") != string::npos;
            ostringstream oss;
            string suggestedFileName;
            if (!(isIE || isChrome || isLynx))
            {
              string dbS;
              stmt->Get(1, dbS);
              oss << dbS;
            }
            else
            {
              oss << "utwor" << this->m_utwId;
            }
            suggestedFileName = oss.str();
            if (suggestedFileName.length() > 250)
              suggestedFileName = suggestedFileName.substr(0, 250);

            suggestedFileName += ".csv";

            UnicodeString icusuggestedFileName = UnicodeString::fromUTF8(suggestedFileName).findAndReplace("\"", "_");
            suggestedFileName.clear();
            icusuggestedFileName.toUTF8String(suggestedFileName);

            this->suggestFileName(suggestedFileName);

            this->setMimeType("text/csv");
          }
          tr->Commit();
        }
        catch(std::exception &e)
        {
          WApplication::instance()->log("error") << e.what();
        }
      }

      ParamsResource::~ParamsResource()
      {
        this->beingDeleted();
      }

      void ParamsResource::handleRequest(const Wt::Http::Request& request,
          Wt::Http::Response& response)
      {
        if (this->m_ss_response.gcount() == 0)
        {
          ostringstream oss;
          string str_response, param;
          string::size_type dotPos;

          ostringstream sql;
          sql << "select * from MIR_PARAMETRY "
                 " where PAR_UTW_ID = " << this->m_utwId;
          try
          {
            Transaction tr = this->m_dm->createTransaction(amRead,
                ilReadCommitted, lrWait);
            tr->Start();
            string sqlstmt = sql.str();

            Statement stmt = this->m_dm->createStatement(&tr);
            stmt->Prepare(sqlstmt);
            stmt->Execute();

            if (stmt->Fetch())
            {
              string paramsNames[173];
              double params[173];

              for (int i = 4; i < 4 + 173; i++)
              {
                stmt->Get(i, params[i - 4]);
                paramsNames[i - 4] = stmt->ColumnName(i);
              }

              this->m_ss_response << paramsNames[0].substr(4);
              for(int i = 1; i < 173; i++)
              {
                this->m_ss_response << ";" << paramsNames[i].substr(4);
              }
              this->m_ss_response << "\r\n";
              oss.setf(ios::fixed, ios::floatfield);
              oss.precision(18);
              oss.str("");

              oss << params[0];
              param = oss.str();
              dotPos = param.find(".");
              param.replace(dotPos, 1, ",");
              this->m_ss_response << param;
              for(int i = 1; i < 173; i++)
              {
                oss.str("");
                oss << params[i];
                param = oss.str();
                dotPos = param.find(".");
                param.replace(dotPos, 1, ",");
                this->m_ss_response << ";" << param;
              }
            }
            tr->Commit();
          }
          catch(std::exception &e)
          {
            WApplication::instance()->log("warn") << e.what();
          }
        }
        this->handleRequestPiecewise(request, response, this->m_ss_response);
      }

You can test this resource in http://synat.eti.pg.gda.pl where you can login as lukasz and password of anakin

The Content-Disposition header with filename is inside contents of response (that is file created at client side).

You probably should change order of headers flushed to client....

I have used the git version from 18.09.2011.

Actions #1

Updated by Koen Deforche over 12 years ago

  • Status changed from New to Resolved
  • Assignee set to Koen Deforche
  • Target version set to 3.1.11

Hey,

Ooops indeed. This is a deployment using FastCGI, I guess (since I found the bug there) ?

I've committed an (untested) fix in git.

Regards,

koen

Actions #2

Updated by Łukasz Matuszewski over 12 years ago

Yes... with latest git it works as expected... even inside handleRequest method.

Off topic:

How can i update my git repo (that is you repo at http://www.webtoolkit.eu/git/wt.git) which will work just as svn update ? I am absolutely newbie in git system.

Actions #3

Updated by Koen Deforche over 12 years ago

  • Status changed from Resolved to Closed

Resolved in Wt 3.1.11

Actions

Also available in: Atom PDF