• Hi,

    I am thinking on expanding the rest api, looking at Orthanc for inspiration. Any ideas? My list sofar:

    Edit: propose to use HTTP commands, make more similar to Orthanc; will implement in Ladle first.

    -- remote server operations

    GET /api/dicom/modalities

    GET /api/dicom/modalities/:id

    PUT /api/dicom/modalities/:id

    POST /api/dicom/modalities

    DEL /api/dicom/modalities/:id

    GET /api/dicom/modalities/:modality/echo

    GET /api/dicom/rs/modalities/:modality/studies

    GET /api/dicom/rs/modalities/:modality/studies/:suid/series

    GET /api/dicom/rs/modalities/:modality/series

    GET /api/dicom/rs/modalities/:modality/studies/:suid/series/:euid/instances

    GET /api/dicom/rs/modalities/:modality/instances

    POST /api/dicom/rs/studies/:suid/series/:euid/instances/:ouid/move?target=AE

    POST /api/dicom/rs/studies/:suid/series/:euid/move?target=AE

    POST /api/dicom/rs/studies/:suid/move?target=AE

    -- delete

    DEL /api/dicom/rs/studies/:suid

    DEL /api/dicom/rs/studies/:suid/series/:euid

    DEL /api/dicom/rs/studies/:suid/series/:euid/instances/:ouid

    -- create zip file (optional anonymisation, parameters in query)

    GET /api/dicom/rs/studies/:suid/series/:euid/instances/:ouid/archive

    GET /api/dicom/rs/studies/:suid/series/:euid/archive

    GET /api/dicom/rs/studies/:suid/archive

    Marcel

    Marcel van Herk is developer of the Conquest DICOM server together with Lambert Zijp.

    Edited once, last by marcelvanherk (September 19, 2022 at 10:43 PM).

  • In what sense? QIDO WADO and STOW are compliant, but I do not think the other items are in the dicom standard.

    Basically I want to create a nice interface for a web-based GUI, so I can also just make these private e.g. /api/conquest/modalities

    Marcel

    Marcel van Herk is developer of the Conquest DICOM server together with Lambert Zijp.

  • Hi, Marcel

    Some of my users from conquest has no public IP.

    Then, I am trying to use ngrok to manage it.

    I have tried:

    Code
    > ngrok tcp 5678
    Session Status                online                                                                                    Account                       Luiz Oliveira (Plan: Free)                                                                Version                       2.3.40 
     Region                        United States (us) 
     Web Interface                 http://127.0.0.1:4040 
     Forwarding                    tcp://2.tcp.ngrok.io:18444-> localhost:5678 
    
    
     Connections                   ttl     opn     rt1     rt5     p50     p90                                                                             0       0       0.00    0.00    0.00    0.00

    If I use:

    F:\Programas\vuejs\nuxt-iclindoctor\server_iclindoctor\api\dicomapi>servertask -p5678 -hCONQUESTSRV1 -q127.0.0.1 "--dolua:dofile([[./queryfunctions.lua]]);echo([[CONQUESTSRV1]])"

    1

    works well.

    But if I use hostname It doesn´t work:

    F:\Programas\vuejs\nuxt-iclindoctor\server_iclindoctor\api\dicomapi>servertask -p5678 -hCONQUESTSRV1 -qtcp://2.tcp.ngrok.io:18444 "--dolua:dofile([[./queryfunctions.lua]]);echo([[CONQUESTSRV1]])"

    DICOM ERROR connect failed on socket level (called not running)

    F:\Programas\vuejs\nuxt-iclindoctor\server_iclindoctor\api\dicomapi>servertask -p5678 -hCONQUESTSRV1 -q2.tcp.ngrok.io:18444 "--dolua:dofile([[./queryfunctions.lua]]);echo([[CONQUESTSRV1]])"

    DICOM ERROR connect failed on socket level (called not running)


    when ngrok starts, It bind the IP to a port. I think the problem the port is changing from

    Code
    tcp://2.tcp.ngrok.io:18444-> localhost:5678 

    Is possible conquest dgate support ngrok syntax "hostname:port" without '-p' parameter? I tried dgate without -p but I had the same problem.

  • Hm,

    I am not sure at all how to do this. The source code of servertask is quite simple. It maps directly to socket::open in socket.cxx. If you have any idea how to adjust it for ngrok that would be great. Socket prpgramming is not my strongest point.

    Marcel

    Marcel van Herk is developer of the Conquest DICOM server together with Lambert Zijp.

  • Hi,

    I think the problem is here:

    //servertask.cxx

    else if (argv[i][1]=='h') strcpy(MYACRNEMA, argv[i]+2);

    else if (argv[i][1]=='p') strcpy(Port, argv[i]+2);

    else if (argv[i][1]=='q') strcpy(ServerCommandAddress, argv[i]+2);

    The argument hostname:port as "2.tcp.ngrok.io:18444" should be parsed to fill 'MYACRNEMA' and 'Port'

    I am not a C++ programmer and I dont have a PC with a stack dev tools mounted to try change it.

  • Hi, Marcel,

    I think I found the problem.

    If I use a IP all works well.

    But If I use a hostname, conquest is unable to resolve it to a IP and I get an error.

    For sample. This is ok:

    servertask -p10979 -hCONQUESTSRV1 -q3.132.159.158 "--dolua:dofile([[./queryfunctions.lua]]);echo([[CONQUESTSRV1]])"

    returns: 1

    But servertask -p10979 -hCONQUESTSRV1 -q6.tcp.ngrok.io "--dolua:dofile([[./queryfunctions.lua]]);echo([[CONQUESTSRV1]])"

    returns

    "DICOM ERROR connect failed on socket level (called not running)"

    Searching in Stackoverflow(https://stackoverflow.com/questions/2151…ress-from-a-url) C++ would need do something as below to get an IP when using hostname :

    On Linux

    C
    #include <stdio.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    int main()
    {
    struct hostent *he=gethostbyname("www.stackoverflow.com");
    char *ip=inet_ntoa(*(struct in_addr*)he->h_addr_list[0]);
    printf(ip);
    }

    On Windows

    C
    #include <stdio.h>
    #include <winsock.h>
    int main()
    {
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2),&wsaData);
    struct hostent *he=gethostbyname("www.stackoverflow.com");
    char *ip=inet_ntoa(*(struct in_addr*)he->h_addr_list[0]);
    printf(ip);
    }

    I have tested resolving hostname to IP in node API and it works.

    Here is the node code:

    Code
    const { lookup } = require("dns").promises;
    const resolvehost = async (h) => {
      try {
        const result = await lookup(h);
        return result.address;
      } catch (e) {
        return "";
      }
    };

    What do you think to do it right into servertask?

    Edited 3 times, last by jweste (September 22, 2022 at 5:00 PM).

  • In what sense? QIDO WADO and STOW are compliant, but I do not think the other items are in the dicom standard.

    Basically I want to create a nice interface for a web-based GUI, so I can also just make these private e.g. /api/conquest/modalities

    Marcel

    I can help you with node version if you need.

  • Hi,

    Ah, the problem is that 6.xxx looks like a numeric IP address to Gethostbyname in socket.cxx (it starts with a number and contains a .) I have updated the source to now scan for any character not . and 0-9. Can you try the adapted servertask.exe?

    Marcel

  • Hi,

    Ah, the problem is that 6.xxx looks like a numeric IP address to Gethostbyname in socket.cxx (it starts with a number and contains a .) I have updated the source to now scan for any character not . and 0-9. Can you try the adapted servertask.exe?

    Marcel

    Hi, Marcel,

    It works like a charm.

    Thanks,

    Luiz

  • Hi, Marcel

    I am back.

    In this route you use:

    -- query all studies on modality

    Code
    routes:get('/api/dicom/rs/modalities/:modality/studies', function (params)
    include('/api/dicom/rquery.lua')
    querystudies(request.query, params.modality)
    end )

    But, in 'querystudies' function you have:

    Code
    function querystudies($query) {
    $defaultTags = [
    "00080005", "00080020", "00080030",
    "00080050", "00080054", "00080056",
    "00080061", "00080090", "00081190",
    "00080201", "00100010", "00100020",
    "00100030", "00100040", "0020000D",
    "00200010", "00201206", "00201208"];
    processData($query, $defaultTags, array("99990C00"=>"PatientName"), "STUDY");
    }

    My question is where params.modality will be used?

    Another question os about 'remoteecho'. Are you executing a echo in a modality or in the server?

    Edited once, last by jweste (October 27, 2022 at 2:54 PM).

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!