Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PhabricatorAPI: raise exceptions on http errors #202

Merged
merged 1 commit into from
Jul 8, 2022

Conversation

suhaibmujahid
Copy link
Member

@suhaibmujahid suhaibmujahid commented Jul 7, 2022

Problem

Currently, when the Phabricator server gets RuntimeException, it will return an HTML response instead of JSON; thus on the client side it will be seen as a JSON encoding problem.

Solution

Raise exception for status before trying to read the response as JSON.

Response example

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Unhandled Exception (&quot;RuntimeException&quot;)</title>
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, user-scalable=no"
    />
    <link
      rel="mask-icon"
      color="#3D4B67"
      href="https://d2mfgivbiy2fiw.cloudfront.net/res/phabricator/db699fe1/rsrc/favicons/mask-icon.svg"
    />
    <link
      rel="apple-touch-icon"
      sizes="76x76"
      href="https://d2mfgivbiy2fiw.cloudfront.net/file/data/x2afrzutthtwelbo5vwo/PHID-FILE-bdjfhroc5wu2wqkcjwe7/favicon"
    />
    <link
      rel="apple-touch-icon"
      sizes="120x120"
      href="https://d2mfgivbiy2fiw.cloudfront.net/file/data/4wl2gbkzzs7nbxsd7wvm/PHID-FILE-3qhlbrkzpn23ktaoxdrw/favicon"
    />
    <link
      rel="apple-touch-icon"
      sizes="152x152"
      href="https://d2mfgivbiy2fiw.cloudfront.net/file/data/euainj2y5n473zveppac/PHID-FILE-oltum3oe4ozuig5kbuef/favicon"
    />
    <link
      rel="icon"
      id="favicon"
      href="https://d2mfgivbiy2fiw.cloudfront.net/file/data/bdfhf2p6vu3d4hd37c7y/PHID-FILE-n3e7vvx45cbgn6zkwzbs/favicon"
    />
    <meta name="referrer" content="no-referrer" />
    <link
      rel="stylesheet"
      type="text/css"
      href="https://d2mfgivbiy2fiw.cloudfront.net/res/defaultX/phabricator/91774514/core.pkg.css"
    />
    <link
      rel="stylesheet"
      type="text/css"
      href="https://d2mfgivbiy2fiw.cloudfront.net/res/defaultX/phabricator/33958f24/rsrc/css/MozillaMOTD.css"
    />
    <script
      type="text/javascript"
      src="https://d2mfgivbiy2fiw.cloudfront.net/res/defaultX/phabricator/98e6504a/rsrc/externals/javelin/core/init.js"
    ></script>
  </head>
  <body class="device-desktop phui-theme-blindigo">
    <div class="main-page-frame" id="main-page-frame">
      <div id="phabricator-standard-page" class="phabricator-standard-page">
        <div
          class="phabricator-main-menu phabricator-main-menu-background"
          id="UQ0_0"
        >
          <a
            class="phabricator-main-menu-search-button phabricator-expand-application-menu"
            data-sigil="jx-toggle-class"
            data-meta="0_2"
            ><span
              class="phabricator-menu-button-icon phui-icon-view phui-font-fa fa-search"
              id="UQ0_1"
            ></span></a
          ><a class="phabricator-main-menu-brand" href="/"
            ><span class="aural-only">Home</span
            ><span class="phabricator-main-menu-eye" style=""></span
            ><span class="phabricator-wordmark">Phabricator</span></a
          >
          <ul class="phui-list-view phabricator-search-menu">
            <li
              class="phui-list-item-view phui-list-item-type-link phabricator-main-menu-search"
            >
              <div class="" data-sigil="">
                <form action="/search/" method="POST">
                  <input
                    type="hidden"
                    name="__csrf__"
                    value="B@ojq3dek57a687ec1cb445978"
                  /><input type="hidden" name="__form__" value="1" />
                  <div class="phabricator-main-menu-search-container">
                    <input
                      type="text"
                      name="query"
                      id="UQ0_2"
                      autocomplete="off"
                      autocorrect="off"
                      autocapitalize="off"
                      spellcheck="false"
                    /><button
                      id="UQ0_4"
                      class="phui-icon-view phui-font-fa fa-search"
                    >
                      <span class="aural-only">Search</span></button
                    ><button
                      class="button dropdown has-icon phui-button-default phabricator-main-menu-search-dropdown"
                      id="UQ0_5"
                      data-sigil="global-search-dropdown"
                      data-meta="0_3"
                    >
                      <span class="aural-only">Configure Global Search</span
                      ><span
                        class="visual-only phui-icon-view phui-font-fa fa-globe"
                        data-sigil="global-search-dropdown-icon"
                        data-meta="0_4"
                        aria-hidden="true"
                      ></span
                      ><span class="caret"></span></button
                    ><input
                      type="hidden"
                      name="search:scope"
                      value="all"
                      data-sigil="global-search-dropdown-input"
                    /><input
                      type="hidden"
                      id="UQ0_6"
                      name="search:application"
                      value="PhabricatorConduitApplication"
                      data-sigil="global-search-dropdown-app"
                    /><input type="hidden" name="search:primary" value="true" />
                    <div
                      id="UQ0_3"
                      class="phabricator-main-menu-search-target"
                    ></div>
                  </div>
                </form>
              </div>
            </li>
          </ul>
          <a
            class="phabricator-core-login-button"
            href="https://phabricator.services.mozilla.com/auth/start/?next=%2Fapi%2Fdifferential.revision.search"
            role="button"
            ><div class="phui-button-text">Log In</div></a
          >
        </div>
        <div
          id="phabricator-standard-page-body"
          class="phabricator-standard-page-body"
        >
          <div class="phui-crumbs-view">
            <a href="/conduit/" class="phui-crumb-view phui-crumb-has-icon"
              ><span
                class="visual-only phui-icon-view phui-font-fa fa-tty"
                data-meta="0_0"
                aria-hidden="true"
              ></span
              ><span class="phui-crumb-name"> Conduit</span> </a
            ><span
              class="visual-only phui-icon-view phui-font-fa fa-angle-right phui-crumb-divider phui-crumb-view"
              data-meta="0_1"
              aria-hidden="true"
            ></span
            ><span class="phui-crumb-view phabricator-last-crumb"
              ><span class="phui-crumb-name">
                Unhandled Exception (&quot;RuntimeException&quot;)</span
              >
            </span>
          </div>
          <form
            method="POST"
            class="aphront-dialog-view aphront-exception-dialog"
            role="dialog"
            data-sigil="jx-dialog"
          >
            <input
              type="hidden"
              name="__csrf__"
              value="B@ojq3dek57a687ec1cb445978"
            /><input type="hidden" name="__form__" value="1" /><input
              type="hidden"
              name="__dialog__"
              value="1"
            />
            <div class="aphront-dialog-head">
              <div class="phui-header-shell">
                <h1 class="phui-header-view">
                  <div class="phui-header-row">
                    <div class="phui-header-col2">
                      <span class="phui-header-header"
                        >Unhandled Exception
                        (&quot;RuntimeException&quot;)</span
                      >
                    </div>
                    <div class="phui-header-col3"></div>
                  </div>
                </h1>
              </div>
            </div>
            <div class="aphront-dialog-body grouped">
              <div class="aphront-unhandled-exception">
                <div class="exception-message">
                  array_walk_recursive() expects parameter 1 to be array, null
                  given
                </div>
              </div>
            </div>
          </form>
          <div class="phabricator-standard-page-footer grouped">
            <a href="https://www.mozilla.org/en-US/privacy/websites/"
              >Privacy</a
            >
            ·
            <a href="https://www.mozilla.org/en-US/privacy/websites/#cookies"
              >Cookies</a
            >
            · <a href="https://www.mozilla.org/en-US/about/legal/">Legal</a>
          </div>
        </div>
      </div>
    </div>
    <script
      type="text/javascript"
      src="https://d2mfgivbiy2fiw.cloudfront.net/res/defaultX/phabricator/994b5954/core.pkg.js"
    ></script>
    <data
      data-javelin-init-kind="merge"
      data-javelin-init-data='{"block":0,"data":[[],[],{"map":{"UQ0_0":"phabricator-search-menu-expanded","UQ0_1":"menu-icon-selected"}},{"items":[{"name":"Search"},{"icon":"fa-globe","name":"All Documents","value":"all"},{"icon":"fa-dot-circle-o","name":"Current Application","value":"application"},{"name":"Saved Queries"},{"icon":"fa-certificate","name":"Open Documents","value":"open"},{"icon":"fa-certificate","name":"Open Tasks","value":"open-tasks"},{"name":"More Options"},{"icon":"fa-search-plus","name":"Advanced Search","href":"\\/search\\/query\\/advanced\\/"},{"icon":"fa-book","name":"User Guide: Search","href":"https:\\/\\/secure.phabricator.com\\/diviner\\/find\\/?name=Search%20User%20Guide&amp;type=article&amp;jump=1"}],"icon":"fa-globe","value":"all"},[]]}'
    ></data
    ><data
      data-javelin-init-kind="behaviors"
      data-javelin-init-data='{"refresh-csrf":[{"tokenName":"__csrf__","header":"X-Phabricator-Csrf","viaHeader":"X-Phabricator-Via","current":"B@ojq3dek57a687ec1cb445978"}],"history-install":[]}'
    ></data
    ><data
      data-javelin-init-kind="behaviors"
      data-javelin-init-data='{"workflow":[],"lightbox-attachments":[],"aphront-form-disable-on-submit":[],"toggle-class":[],"phabricator-gesture":[],"device":[],"high-security-warning":[{"show":false,"uri":"\\/auth\\/session\\/downgrade\\/","message":"Your session is in high security mode. When you finish using it, click here to leave."}],"phabricator-keyboard-shortcuts":[{"helpURI":"\\/help\\/keyboardshortcut\\/","searchID":"UQ0_2","pht":{"\\/":"Give keyboard focus to the search box.","?":"Show keyboard shortcut help for the current page."}}],"phabricator-search-typeahead":[{"id":"UQ0_3","input":"UQ0_2","button":"UQ0_4","selectorID":"UQ0_5","applicationID":"UQ0_6","defaultApplicationIcon":"fa-dot-circle-o","appScope":"application","src":"\\/typeahead\\/class\\/PhabricatorSearchDatasource\\/","limit":10,"placeholder":"Search","scopeUpdateURI":"\\/settings\\/adjust\\/?key=search-scope"}],"quicksand-blacklist":[{"patterns":["\\/phame\\/live\\/.*","\\/conpherence\\/.*","\\/Z\\\\d+","\\/file\\/(data|download)\\/.*","\\/phortune\\/.*","\\/auth\\/.*"]}]}'
    ></data>
  </body>
</html>

@suhaibmujahid suhaibmujahid requested a review from marco-c July 7, 2022 18:31
@suhaibmujahid suhaibmujahid merged commit e8c19af into mozilla:master Jul 8, 2022
@suhaibmujahid suhaibmujahid deleted the phab-server-errors branch July 8, 2022 18:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants