pistacheio / pistache

A high-performance REST toolkit written in C++
https://pistacheio.github.io/pistache/
Apache License 2.0
3.17k stars 698 forks source link

Swagger file api.json serialization support #169

Closed xoac closed 6 years ago

xoac commented 6 years ago

I wanted to generate documentaion from code. So I used this:

        Rest::Swagger swagger(desc);
        swagger
            .uiPath("/doc")
            .uiDirectory("doc")
            .apiPath("/api")
            .serializer(&Pistache::Rest::Serializer::rapidJson)
            .install(router);

But uiPath and uiDirectory works. But when I try get request for /api The program core dump or in loop printing some data (I would say not random):


�/�U�/api%&' Q� F       �QH�w   0�U�@0�U���w

@��Q��w

��wQ�0�U���w
�L��w�3�U��Q�3�U���w�3�U��L�3�U��
                                 @�� ��  1�U�
                                             DS Event API@1�U�0.1�vC�� �1�U�1�U�1�U�
user-agent�1�U�ser-agent 3�U�03�U�@3�U�2�U�Custom�� ((`3�U�@2�U���1��B`2�U�/ds�������`� �� �� � �� �� �� �� �?�� �� �?��� �� �� P3�U�0.0.0.0U�Px#@U�Px#w�3�U�~�P
@�      @�Q�U��Q�U��Q�U��Q�U�4R�U�`R�U�kR�U��R�U��R�U��R�U�IS�U�[S�U�qS�U��S�U��S�U��S�U��S�U��S�U�
                                                                                                   T�U�"T�U�3T�U�=T�U�LT�U�hT�U�|T�U��T�U��T�U�U�U��U�U��U�U��U�U�▒V�U�JV�U�vV�U��V�U��V�U��V�U�<W�U�OW�U��W�U��W�U��W�U��W�U��W�U��W�U��W�U�X�U�6X�U�NX�U��X�U��X�U��X�U��X�U��X�U�Y�U�&Y�U�`Y�U�uY�U��Y�U��Y�U��Y�U��Y�U��Y�U��Y�U�! �U�����d@@8      �       @
                 �
��97�U�▒�_�U�I7�U����x�.�)��"l,Ҹ�x86_64./outstationCOLORFGBG=15;0COLORTERM=truecolorDBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/busDESKTOP_SESSION=/usr/share/xsessions/plasmaDISPLAY=:0GS_LIB=/home/sylwek/.fontsGTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/home/sylwek/.gtkrc-2.0:/home/sylwek/.config/gtkrc-2.0GTK_MODULES=canberra-gtk-moduleGTK_RC_FILES=/etc/gtk/gtkrc:/home/sylwek/.gtkrc:/home/sylwek/.config/gtkrcHOME=/home/sylwekKDE_FULL_SESSION=trueKDE_MULTIHEAD=falseKDE_SESSION_UID=1000KDE_SESSION_VERSION=5KONSOLE_DBUS_SERVICE=:1.320KONSOLE_DBUS_SESSION=/Sessions/1KONSOLE_DBUS_WINDOW=/Windows/1KONSOLE_PROFILE_NAME=LANG=pl_PL.UTF-8LANGUAGE=LOGNAME=sylwekMAIL=/var/spool/mail/sylwekMAVEN_OPTS=-Xmx512mMOZ_PLUGIN_PATH=/usr/lib/mozilla/pluginsOLDPWD=/home/sylwek/workspace/OutstationPAM_KWALLET5_LOGIN=/run/user/1000/kwallet5.socketPATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perlPROFILEHOME=/home/sylwek/workspace/OutstationPULSE_PROP_OVERRIDE_application.icon_name=system-file-managerPULSE_PROP_OVERRIDE_application.name=DolphinPULSE_PROP_OVERRIDE_application.version=17.08.3PWD=/home/sylwek/workspace/Outstation/buildQT_AUTO_SCREEN_SCALE_FACTOR=0QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1R600_DEBUG=precompile llvm sisched forcedma sbclSESSION_MANAGER=local/wiki-igt:@/tmp/.ICE-unix/804,unix/wiki-igt:/tmp/.ICE-unix/804SHELL=/usr/bin/zshSHELL_SESSION_ID=bdc19e0a2725422082840251b43d0db1SHLVL=2SSH_AGENT_PID=757SSH_AUTH_SOCK=/tmp/ssh-bwAAcfWhMN2o/agent.756TERM=xterm-256colorUSER=sylwekWINDOWID=83886086XAUTHORITY=/tmp/xauth-1000-_0XCURSOR_THEME=breeze_cursorsXDG_CURRENT_DESKTOP=KDEXDG_DATA_DIRS=/usr/share:/usr/share:/usr/local/shareXDG_RUNTIME_DIR=/run/user/1000XDG_SEAT=seat0XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0XDG_SESSION_CLASS=userXDG_SESSION_DESKTOP=KDEXDG_SESSION_ID=c2XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session1XDG_SESSION_TYPE=x11XDG_VTNR=1_=/home/sylwek/workspace/Outstation/build/./outstationPAGER=lessLESS=-RLC_CTYPE=pl_PL.UTF-8LSCOLORS=GxfxcxdxbxegedabagacadLS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:�S���nt�@��`����-�U�0.1manageme �  .�U�8.�U� �w�h.�U����.�U��.�U�Custom�� ((�.�U�.�U�/�U�/ds�Q�� �� �� �� 0� 0� �� p� p� @� �?�/�U�/doc03D�/�U�doc

I use rapidJSON taged v1.10

If I change this .apiPath("/api") to .apiPath("/api.json") I got Not Found from server. So example don't work at all.

xoac commented 6 years ago

Quick ask quick solution!

Here, I have used:

    void EventServicer::start() {
        router.initFromDescription(desc);

        static Rest::Swagger swagger(desc);
        swagger
            .uiPath("/doc")
            .uiDirectory("doc")
            .apiPath("/api")
            .serializer(&Pistache::Rest::Serializer::rapidJson)
            .install(router);

        httpEndpoint->setHandler(router.handler());
        httpEndpoint->serveThreaded();
    }

This cause swagger be local variable. and disappear after function start has ended. I came up with 2 quick solutions: